pthreads – Rejoignez un groupe de threads, attendez qu’il en sorte

Dans l’interface de thread POSIX, pthread_join(thread) peut être utilisé pour bloquer jusqu’à ce que le thread spécifié se termine.

Y a-t-il une fonction similaire qui permettra à l’exécution de bloquer jusqu’à ce qu’un thread enfant se termine?

Ce serait similaire à l’appel système UNIX wait() , sauf qu’il serait applicable aux threads enfants, pas aux processus.

Je ne pense pas que cela soit directement possible à partir de pthreads, mais vous pouvez y remédier assez facilement.

À l’aide de l’API pthreads, vous pouvez utiliser pthread_cond_wait et friends pour configurer une “condition” et l’attendre. Lorsqu’un thread est sur le sharepoint quitter, indiquez la condition pour réveiller le thread en attente.

Une autre méthode consiste à créer un tuyau avec un pipe et, lorsqu’un fil va sortir, write sur le tuyau. Faites en sorte que le fil principal attende à l’autre bout du tuyau avec select , poll , epoll ou votre variante préférée. (Cela vous permet également d’attendre simultanément sur d’autres FD.)

Les versions les plus récentes de Linux incluent également “eventfds” pour faire la même chose, voir man eventfd , mais notez que cela n’a été ajouté que récemment. Notez que ce n’est pas POSIX, c’est uniquement Linux, et il n’est disponible que si vous êtes raisonnablement à jour. (2.6.22 ou mieux.)

Personnellement, je me suis toujours demandé pourquoi cette API n’était pas conçue pour traiter ces choses comme des descripteurs de fichiers. Si c’était moi, ce seraient des “événements”, et vous pourriez select fichiers, des threads, des timers …

Je ne pense pas qu’il y ait de fonction dans l’interface de thread POSIX pour cela.

Vous devez créer votre propre version de celui-ci – par exemple, un tableau de drapeaux (un drapeau par thread) protégés par un mutex et une variable de condition; où juste avant “pthread_exit ()”, chaque thread acquiert le mutex, définit son drapeau, puis “pthread_cond_signal ()”. Le thread principal attend le signal, puis vérifie le tableau d’indicateurs pour déterminer le (s) thread (s) à rejoindre (il peut y avoir plus d’un thread à rejoindre d’ici là).

Vous devez implémenter une variable conditionnelle de type personnalisation pthread: pthread_cond_wait (), pthread_cond_signal () / pthread_cond_broadcast ().