Supposons que je démarre un std::thread
et puis detach()
il, donc le thread continue à s'exécuter même si celui std::thread
qui l'a représenté une fois, sort de la portée.
Supposons en outre que le programme ne dispose pas d'un protocole fiable pour joindre le thread détaché 1 , de sorte que le thread détaché s'exécute toujours lorsqu'il se main()
termine.
Je ne trouve rien dans la norme (plus précisément, dans le projet N3797 C ++ 14), qui décrit ce qui devrait se passer, ni 1.10 ni 30.3 ne contiennent un libellé pertinent.
1 Une autre question, probablement équivalente, est la suivante: "un thread détaché peut-il être joint à nouveau", car quel que soit le protocole que vous inventez pour le rejoindre, la partie de signalisation devrait être Décider de mettre le thread en veille pendant une heure juste après que la signalisation a été effectuée sans aucun moyen pour l'extrémité de réception de détecter de manière fiable que le thread est effectivement terminé.
Si le fait de manquer de main()
threads détachés en cours d'exécution n'est pas un comportement défini, alors toute utilisation de std::thread::detach()
est un comportement indéfini à moins que le thread principal ne se termine jamais 2 .
Ainsi, manquer de main()
threads détachés en cours d'exécution doit avoir des effets définis . La question est: où (dans le standard C ++ , pas POSIX, pas de documentation OS, ...) sont définis ces effets.
2 Un fil détaché ne peut pas être joint (au sens de std::thread::join()
). Vous pouvez attendre les résultats des threads détachés (par exemple via un futur from std::packaged_task
, ou par un sémaphore de comptage ou un drapeau et une variable de condition), mais cela ne garantit pas que le thread a fini de s'exécuter . En effet, à moins que vous ne mettiez la partie signalisation dans le destructeur du premier objet automatique du thread, il y aura , en général, du code (destructeurs) qui s'exécutera après le code de signalisation. Si le système d'exploitation planifie le thread principal pour qu'il consomme le résultat et se termine avant que le thread détaché ait fini d'exécuter lesdits destructeurs, qu'est-ce que ^ Sera défini pour se produire?
std::exit
ou la sortie demain
est suffisant, mais pas nécessaire, pour satisfaire ces exigences." (le paragraphe entier peut être pertinent) Voir aussi [support.start.term] / 8 (std::exit
est appelé aumain
retour)