デタッチされたスレッドが Main() を超えた場合はどうなりますか?
C では、 detach() を使用してスレッドをデタッチし、実行できるようにします。最初にそれらを作成した std::thread オブジェクトとは独立して。ただし、main() が終了するときの切り離されたスレッドに対する標準の動作はあいまいなままです。
標準の沈黙と暗黙の影響
C 14 ドラフトのセクション 1.10 も 30.3 も明示的には規定されていませんmain() が終了したときの切り離されたスレッドの運命を定義します。このあいまいさにより、次のようないくつかの疑問が生じます:
明示的なガイドラインがないため、デタッチされたスレッドで main() を実行するには、切り離されたスレッドを停止すると、本質的に detach() が無意味になるため、定義された効果があります。
暗黙の制限
標準では、切り離されたスレッドに何が起こるかを明示的に規定していませんが、いくつかの制約があります:
切り離されたスレッドの結合
切り離されたスレッドを結合できるかどうかの問題も回答で取り上げられています。その答えは、*_at_thread_exit ファミリの関数 (notify_all_at_thread_exit()、std::promise::set_value_at_thread_exit() など) を使用して、切り離されたスレッドを実際に結合できることを明らかにしています。
未定義の動作の軽減
回避するにはデタッチされたスレッドが実行中に main() が終了するときの未定義の動作については、次の戦略を検討してください:
結論
C 標準では、main() が終了したときの切り離されたスレッドの動作を明示的に定義していませんが、次のような制限と影響を与えています。定義された効果。これらの制限を遵守し、*_at_thread_exit ファミリの関数を使用することで、プログラマは切り離されたスレッドを処理し、未定義の動作を回避できます。
以上がC で `main()` 関数が終了すると、切り離されたスレッドはどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。