私はそれを開始しているstd::thread
と仮定しdetach()
て、それstd::thread
が一度それを表していたとしても、スレッドがスコープ外になったとしても、スレッドは実行を続けます。
さらに、プログラムには、切り離されたスレッド1に参加するための信頼できるプロトコルがないため、main()
終了時に切り離されたスレッドが引き続き実行されると仮定します。
1.10と30.3のどちらにも適切な表現が含まれておらず、何が起こるかを説明している標準(より正確には、N3797 C ++ 14ドラフト)には何も見つかりません。
1別の、おそらく同等の質問は、「デタッチされたスレッドを再び結合できるか」です。これは、どのプロトコルを結合しようと考えている場合でも、スレッドがまだ実行されている間にシグナリング部分を実行する必要があるため、OSスケジューラが受信側がスレッドが実際に終了したことを確実に検出する方法がなく、シグナリングが実行された直後に、スレッドを1時間スリープさせることにしました。
が不足している場合はmain()
デタッチスレッドが実行されているとすると、未定義の動作で、その後、任意の使用は、std::thread::detach()
メインスレッドが終了したことがない場合を除き、未定義の動作です2。
したがって、main()
デタッチされたスレッドを実行して実行すると、定義された効果が必要になります。問題は次のとおりです。(C ++標準では、POSIXではなく、OSドキュメントではありません...)定義されている効果です。
2切り離されたスレッドは結合できません(の意味でstd::thread::join()
)。デタッチされたスレッドからの結果を待つことはできますが(たとえば、からstd::packaged_task
、またはカウントセマフォまたはフラグと条件変数によって)、それはスレッドが実行を完了したことを保証するものではありません。あなたがスレッドの最初の自動オブジェクトのデストラクタにシグナリング部分を入れない限り、確かに、そこになり、一般的には、その実行コード(デストラクタ)も後のシグナリングコード。OSがメインスレッドをスケジュールして結果を消費し、デタッチされたスレッドがデストラクタの実行を完了する前に終了する場合、^ Wisはどのように定義されますか?
std::exit
またはから出るmain
これらの要求を満たすために、必要十分な、しかし、ではありません。」(段落全体が関連する場合があります)[support.start.term] / 8(戻りstd::exit
時に呼び出される)も参照してくださいmain