終了呼び出すには多くの理由があるhttp://en.cppreference.com/w/cpp/error/terminateで述べたように。私は、ほぼ同じ時期に、これらの理由のいくつかが2つのスレッドで発生するケースを想像することができます。ユーザーが指定したterminate()関数はスレッドセーフである必要がありますか?
Q1は、私が最初に終了する前に2回目の呼び出しが始まる意味同じ時間で、同時に2回以上呼び出すことがstd::set_terminate
によって設定された機能を終了することができます。
Thread1 Thread2
| |
_ |
t |
e |
r |
m |
i _
n t
a e
t r
e m
- ?
Q2最初期終了した場合Q1は== YES、そして何が起こる場合。それはSTD ::中止に終わった場合、私は推測し、その後、プログラムは終了しますが、ユーザーがプログラムを中止しない終了している場合どうなりますか?
Q3この終了コールの原因となったスレッドのコンテキストで終了機能がstd::set_terminate
で呼び出されていますか?
+1。件名の質問に答えるだけです:ユーザ提供の終了機能はスレッドセーフでなければなりませんか?他の「災害時の」機能はどうですか? new_handlerはどうですか?このgccのアドバイスは、二重削除の危険がありますか?http://gcc.gnu.org/onlinedocs/libstdc++/manual/dynamic_memory.html? – PiotrNycz
'std :: terminate'は同時に呼び出すことができるので、' terminate_handler'はスレッドセーフでなければなりません。 'new_handler'を含め、標準で指定されている他のすべてのハンドラについても同様です。はい、gccの例では、二重削除を実行する危険性があります。これは、「安全」に関する原子交換によって解決することができます。 –
"std :: set_terminateで設定された関数はグローバルです" - なぜですか?いくつかの実装では、ローカルであると言われています([ms:関数はスレッドごとに個別に保持されます](http://msdn.microsoft.com/en-us/library/aa272914(v=60).aspx); [ibm :これをスレッド・レベルの終了で無効にすることができます](http://publib.boulder.ibm.com/infocenter/zos/v1r11/index.jsp?topic=/com.ibm.zos.r11.bpxbd00/setterm)。 htm); [sun:スレッドが独自に設定できる](http://www.amath.unc.edu/sysadmin/DOC4.0/c-plusplus/c%2B%2B_ug/Exception_Handling.doc.html) standard.http://stackoverflow.com/q/15367060/196561に正確な定義が見つかりません。 – osgx