2017-03-29 9 views
0

Selon POSIX, un ID de thread peut être réutilisé si le thread de support d'origine est terminé. Par conséquent, aurait-on besoin d'utiliser un mutex ou un sémaphore lors de l'appel pthread_join()? Parce que, il peut arriver que le thread cible, que l'on veut rejoindre, soit déjà terminé et qu'un autre thread avec le même ID de thread a été créé, avant d'appeler pthread_join() dans le thread d'origine. Cela ferait croire au thread d'origine que le thread cible n'est pas terminé, bien que ce ne soit pas le cas.pthread_join() est-il une fonction critique?

Répondre

2

Je pense que vous trouverez que cela fonctionne de la même manière que les processus sous UNIX. Un thread joignable n'est pas considéré vraiment terminé jusqu'à ce que quelque chose l'ait rejoint. Ceci est similaire aux processus UNIX car, même s'ils sont techniquement sortis, suffisamment d'informations d'état (y compris le PID, qui ne peut pas encore être réutilisé) restent en suspens jusqu'à ce qu'un autre processus fasse wait dessus. Ce n'est qu'après ce point que le PID devient disponible pour réutilisation. Ce genre de processus s'appelle un zombie, puisqu'il est mort mais pas mort.

Ceci est supporté par le pthread_join documentation qui stipule:

non à se joindre à un fil qui est joignable (à savoir, qui ne soit pas détachée), produit un « fil zombie ». Évitez cela, car chaque thread zombie consomme des ressources système, et quand suffisamment de threads zombies se sont accumulés, il ne sera plus possible de créer de nouveaux threads (ou processus).

et pthread_create, qui stipule:

uniquement lorsqu'un thread a été terminé jumelables rejoint sont les derniers de ses ressources relâchées au système.

+0

Ok, et le thread principal est-il raccordable? Si oui, qui le rejoint pour être considéré comme vraiment fini? Même question avec les processus. Merci beaucoup. –

+0

@Jonathan, je crois que tous les fils (y compris le principal) sont destinés à être des pairs en ce que n'importe quel fil peut se joindre à un autre. Le thread principal est spécial en ce que la fermeture entraînera la fin de tous les threads. – paxdiablo