2010-09-21 6 views
49

Je me sers de la bibliothèque pthread pour créer & rejoindre les discussions en C.individuelle contre POSIX Threads associable

  1. Quand dois-je créer un fil comme détaché, dès le départ? Est-ce qu'il offre un avantage de performance par rapport à un thread joignable?

  2. Est-il légal de ne pas faire un pthread_join() sur un thread joignable (par défaut)? Ou un tel thread devrait-il toujours utiliser la fonction detach() avant pthread_exit() ing?

Répondre

67
  1. Créer un fil détaché quand vous savez que vous ne voulez pas attendre avec pthread_join(). Le seul avantage de performance est que lorsqu'un thread détaché se termine, ses ressources peuvent être libérées immédiatement au lieu d'avoir à attendre que le thread soit joint avant que les ressources puissent être libérées.

  2. Il est 'légal' de ne pas rejoindre un thread joignable; mais ce n'est généralement pas conseillé parce que (comme indiqué précédemment) les ressources ne seront pas libérées jusqu'à ce que le thread soit joint, ainsi elles resteront attachées indéfiniment (jusqu'à ce que le programme se termine) si vous ne le rejoignez pas.

+0

doute: dans le cas de fils détachés, que se passe-t-il si le filetage principal se termine avant que le fil détaché ne soit terminé? Je pense que cela mettrait fin au processus qui tue tous les threads. Alors Dans quels scénarios sont utilisés les threads détachés parce que je devrais être sûr que le thread détaché a terminé l'exécution? – Ajax

+0

@Ajax: Empiriquement, si le thread principal se termine, le programme se termine et les threads sont ... terminés. Cela, au moins, semble être le comportement sur Mac OS X (10.10.1 Yosemite). Je ne trouve rien dans la documentation POSIX qui indique que d'autres threads continuent si 'exit()' ou '_exit()' ou '_Exit()' est appelé. Si le thread principal fait 'pthread_exit()', alors les autres threads auront une chance de se terminer. –

+0

Sur une note différente: Les filets détachables sont bons pour quand vous avez déjà un autre mécanisme d'interrogation en place; vous pouvez utiliser ce même mécanisme d'interrogation pour vérifier l'état du résultat, et ainsi savoir si le thread est terminé ou non. C'est un cas de "Est-il prêt? Si oui, utilisez-le." –