スレッドボイド内の切り離されたスレッド
マルチスレッドプログラミングでは、切り離されたスレッドは、元の所有者のスレッドから分離された後でも実行を継続します。 。ここで疑問が生じます: メインスレッドが終了すると、まだ実行中の切り離されたスレッドはどうなりますか?
標準応答
C 標準 (N3797) は沈黙したままですmain() が終了したときの切り離されたスレッドの運命について。セクション 1.10 (プログラムの終了) もセクション 30.3 (スレッド) もこの動作を明示的に定義していません。
この省略にもかかわらず、一般に、切り離されたスレッドは実行が完了するまで実行を継続すると想定されます。この仮定は、スレッドがオペレーティング システムによって制御されるエンティティであり、プログラムのメイン スレッドによって終了できない可能性があるという事実に由来します。
潜在的な危険
ただし、デタッチされたスレッドは許可されます。スレッドが無期限に継続されると、これらのスレッドが他のスレッドに属する変数や静的オブジェクトにアクセスしたり、静的オブジェクトの破棄後に静的オブジェクトに触れたりした場合、未定義の動作が発生する可能性があります。
特に、C 標準 (セクション 1) では、すべてのスレッド オブジェクトが破棄され、潜在的なシグナル ハンドラーの実行が終了した後は、シグナル ハンドラーで許可されているコードのみが許可されると規定されています (例: 、<アトミック>ライブラリ)。これにより、条件変数を含むほとんどの C ライブラリ機能が除外されます。
例外的なアプローチ
main() が終了したときに切り離されたスレッドがまだ実行されている間の未定義の動作を防ぐために、開発者は以下を採用できます。 2 つのアプローチのいずれか:
結論
ただし、C 標準ではデタッチされたオブジェクトの動作を明示的に定義していません。 main() が終了すると、スレッドは完了するまで実行を継続すると推測できます。開発者は、潜在的な危険を認識し、未定義の動作を避けるために適切な手段 (手動参加またはシグナル ハンドラーの安全性) を採用する必要があります。
以上がC でメインスレッドが終了すると、切り離されたスレッドはどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。