J'essaye d'émuler un mécanisme de rappel en C avec pthreads. Le code que j'ai est ci-dessous:Passer le pointeur de fonction dans une structure avec pthreads
#include <stdio.h>
#include <pthread.h>
struct fopen_struct {
char *filename;
char *mode;
void *(*callback) (FILE *);
};
void *fopen_callback(FILE *);
void fopen_t(void *(*callback)(FILE *), const char *, const char *);
void *__fopen_t__(void *);
void fopen_t(void *(*callback)(FILE *), const char *filename, const char *mode) {
struct fopen_struct args;
args.filename = filename;
args.mode = mode;
args.callback = callback;
pthread_t thread;
pthread_create(&thread, NULL, &__fopen_t__, &args);
}
void *__fopen_t__(void *ptr) {
struct fopen_struct *args = (struct fopen_struct *)ptr;
FILE *result = fopen(args -> filename, args -> mode);
args -> callback(result);
}
int main() {
fopen_t(&fopen_callback, "test.txt", "r");
}
void *fopen_callback(FILE *stream) {
if (stream != NULL)
printf("Opened file successfully\n");
else
printf("Error\n");
}
Cette compile, mais lors de l'exécution, il se termine sans une erreur ou un message à l'écran. Qu'est-ce que je rate?
Votre filetage principal se termine prématurément. – hetepeperfan
Cela semble un peu lourd d'engendrer un thread juste pour exécuter un callback. Si j'étais vous, j'aurais créé un fil dédié à l'exécution du rappel. Lorsqu'un rappel est nécessaire, vous pouvez le placer dans une file d'attente qui sera traitée par le thread de rappel. Bien sûr, si le travail effectué par le callback est trop important (mais il ne devrait pas l'être), générer un thread pour cela est correct :) – Rerito