2012-10-27 13 views
11

終了呼び出すには多くの理由がある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で呼び出されていますか?

答えて

7

Q1

はい、std::terminateを同時に呼び出すことができます。

Q2

標準はterminate_handlerがない「呼び出し元に戻ることなく、プログラムの実行を終了」することが未定義の動作であると言います。 terminate_handler試みはいずれかの通常、または非常に、返却する場合、私は、精通してるの実装では、abort()が呼び出されます。

Q3

std::terminateによって設定された機能は、ローカル、グローバル、ではないスレッドです。したがって、あるスレッドは他のスレッドに影響を与えることができますC++ 98/03で

terminateを伴うキャッチされない例外に呼び出されたときに使用terminate_handler、例外がスローされたときに有効だったものではなく、terminateが実際に呼ばれる効果で一つである(ただし、それらは通常は同じです)。

はC++ 11で、これは変更された標準は現在使用ハンドラが呼び出された時 terminateの場所での一つであることを述べています。この変更は誤って行われており、将来のドラフトで修正される可能性が最も高いでしょう。ここでは、この問題を追跡LWGの問題です:

http://cplusplus.github.com/LWG/lwg-active.html#2111

更新

レネクサ、KS春2015年の会議で、LWGは、既存の動作を標準化することを決定し、それが指定されていないときに、新しいterminate_handler作らスタック巻き戻し中にset_terminateが呼び出された場合に有効になります。私。実装はC++ 98/03規則またはC++ 11規則のいずれかに従うことが許されます。

コードをポータブルにするには、terminate_handlerを設定する必要がある場合は、プログラムの起動時に例外がスローされる前に実行してから、set_terminateを呼び出す習慣を怠らないでください。

+0

+1。件名の質問に答えるだけです:ユーザ提供の終了機能はスレッドセーフでなければなりませんか?他の「災害時の」機能はどうですか? new_handlerはどうですか?このgccのアドバイスは、二重削除の危険がありますか?http://gcc.gnu.org/onlinedocs/libstdc++/manual/dynamic_memory.html? – PiotrNycz

+0

'std :: terminate'は同時に呼び出すことができるので、' terminate_handler'はスレッドセーフでなければなりません。 'new_handler'を含め、標準で指定されている他のすべてのハンドラについても同様です。はい、gccの例では、二重削除を実行する危険性があります。これは、「安全」に関する原子交換によって解決することができます。 –

+0

"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

関連する問題