Comme indiqué dans http://en.cppreference.com/w/cpp/error/terminate il existe de nombreuses raisons d'appeler se terminer. Je peux imaginer le cas où presque dans le même temps certaines de ces raisons se produisent dans deux fils.La fonction terminate() doit-elle être thread-safe?
Q1 peut la fin fonction définie par std::set_terminate
être appelé deux fois ou plus en même temps, en même temps, je veux dire deuxième appel commence avant la première a pris fin.
Thread1 Thread2
| |
_ |
t |
e |
r |
m |
i _
n t
a e
t r
e m
- ?
Q2 Si Q1 == OUI, alors ce qui se passe si Achever d'abord pris fin. Je suppose que si cela se terminait par std :: abort, alors le programme se termine, mais que se passe-t-il si l'utilisateur a fourni finit n'abandonne pas le programme?
Q3 La fonction terminate est-elle définie par std::set_terminate
dans le contexte de l'unité d'exécution qui a provoqué cet appel de fin?
+1.Juste pour répondre à la question dans le sujet: la fonction de terminaison fournie par l'utilisateur doit être thread safe? Qu'en est-il des autres fonctions "on disaster"? Qu'en est-il de new_handler? Ce conseil de gcc est-il dangereux d'être en double suppression: http://gcc.gnu.org/onlinedocs/libstdc++/manual/dynamic_memory.html? – PiotrNycz
Puisque 'std :: terminate' peut être appelé simultanément,' terminate_handler' devrait être thread-safe. Et la même chose est vraie pour tous les autres gestionnaires spécifiés dans la norme, y compris 'new_handler'. Oui, l'exemple gcc risque d'effectuer une double suppression. Cela pourrait être résolu avec un échange atomique sur 'safety'. –
"fonction définie par std :: set_terminate est un global" - Pourquoi? Certaines implémentations indiquent qu'il est local ([ms: les fonctions terminate sont gérées séparément pour chaque thread] (http://msdn.microsoft.com/fr-fr/library/aa272914 (v = vs.60) .aspx); [ibm : Vous pouvez remplacer cela par une terminaison au niveau du thread] (http://publib.boulder.ibm.com/infocenter/zos/v1r11/index.jsp?topic=/com.ibm.zos.r11.bpxbd00/setterm. htm); [sun: thread peut définir son propre] (http://www.amath.unc.edu/sysadmin/DOC4.0/c-plusplus/c%2B%2B_ug/Exception_Handling.doc.html)) Can ' t trouver la définition exacte dans le standard.http: //stackoverflow.com/q/15367060/196561 – osgx