pthread_cleanup_pop avec l’argument 0?

J’étudie le fil dans le livre APUE 2e

Je pensais que les fonctions pthread_cleanup_pop servent à définir ou non la fonction poussée par pthread_cleanup_push (). Donc, si l’argument est zéro, il n’est pas exécuté et non nul, exécuté.

Mais j’ai regardé le code Figure 11.5 dans APUE. C’est…

#include "apue.h" #include  void cleanup(void *arg) { printf("cleanup: %s\n", (char *)arg); } void * thr_fn1(void *arg) { printf("thread 1 start\n"); pthread_cleanup_push(cleanup, "thread 1 first handler"); pthread_cleanup_push(cleanup, "thread 1 second handler"); printf("thread 1 push complete\n"); if (arg) return((void *)1); pthread_cleanup_pop(0); pthread_cleanup_pop(0); return((void *)1); } void * thr_fn2(void *arg) { printf("thread 2 start\n"); pthread_cleanup_push(cleanup, "thread 2 first handler"); pthread_cleanup_push(cleanup, "thread 2 second handler"); printf("thread 2 push complete\n"); if (arg) pthread_exit((void *)2); pthread_cleanup_pop(0); pthread_cleanup_pop(0); pthread_exit((void *)2); } int main(void) { int err; pthread_t tid1, tid2; void *tret; err = pthread_create(&tid1, NULL, thr_fn1, (void *)1); if (err != 0) err_quit("can't create thread 1: %s\n", strerror(err)); err = pthread_create(&tid2, NULL, thr_fn2, (void *)1); if (err != 0) err_quit("can't create thread 2: %s\n", strerror(err)); err = pthread_join(tid1, &tret); if (err != 0) err_quit("can't join with thread 1: %s\n", strerror(err)); printf("thread 1 exit code %d\n", (int)tret); err = pthread_join(tid2, &tret); if (err != 0) err_quit("can't join with thread 2: %s\n", strerror(err)); printf("thread 2 exit code %d\n", (int)tret); exit(0); } 

dans ce programme, bien que les fonctions pop aient zéro comme argument, les fonctions poussées sont exécutées (“thread 2 premier gestionnaire”, “thread 2 deuxième gestionnaire”, imprimés par la fonction de nettoyage)

pourquoi pop fonctionne même si mis 0 pour argument?

ai-je mal compris pthread_cleanup_pop ??

ai-je mal compris pthread_cleanup_pop?

Non, tu ne l’as pas fait

La raison pour laquelle votre code a exécuté des gestionnaires de nettoyage est que votre contrôle n’atteint jamais pthread_cleanup_pop(0) . Au lieu de cela, vous exécutez toujours return dans thr_fn1 et pthread_exit dans thr_fn2 .

Essayez de créer les threads avec pthread_create(&tid1, NULL, thr_fn1, (void *)0); au lieu de 1 . Quand je fais cela, je reçois (attendu):

 thread 1 start thread 1 push complete thread 2 start thread 2 push complete thread 1 exit code 1 thread 2 exit code 2