std::thread
を開始し、次にそれを開始すると仮定するとdetach()
、スレッドはstd::thread
、かつてそれを表していた が範囲外になっても実行を続けます。
さらに、切り離されたスレッド1に参加するための信頼できるプロトコルがプログラムにないため、終了時に切り離されたスレッドが引き続き実行されると仮定しmain()
ます。
標準 (より正確には、N3797 C++14 ドラフト) には、何が起こるべきかを説明するものは何も見つかりません。
1別の、おそらく同等の質問は、「切り離されたスレッドを再び参加できるか」です。これは、参加するために発明しているプロトコルが何であれ、スレッドがまだ実行されている間にシグナリング部分を実行する必要があり、OS スケジューラがスレッドが実際に終了したことを受信側が確実に検出する方法がないため、シグナリングが実行された直後にスレッドを 1 時間スリープさせることにしました。
main()
分離されたスレッドが実行されている状態で不足することが未定義の動作である場合、メインスレッドが決して終了しない限り、 の使用は未定義の動作です2。std::thread::detach()
したがって、切り離されたスレッドが実行されている状態で不足すると、定義された効果が発生main()
するはずです。問題は、 ( C++ 標準では、POSIX ではなく、OS ドキュメントではなく、...) これらの効果が定義されている場所です。
2切り離されたスレッドを結合することはできません ( の意味でstd::thread::join()
)。切り離されたスレッドからの結果を待つことはできますが (たとえば、future from を介してstd::packaged_task
、またはカウント セマフォまたはフラグと条件変数によって)、スレッドが の実行を終了したことを保証するものではありません。実際、シグナル部分をスレッドの最初の自動オブジェクトのデストラクタに入れない限り、一般に、シグナル コードの後に実行されるコード (デストラクタ) が存在します。切り離されたスレッドが上記のデストラクタの実行を終了する前に、OS がメイン スレッドが結果を消費して終了するようにスケジュールした場合、何が起こると定義されていますか?