std::async によって返される std::future デストラクターの性質をブロックする
タスクを非同期で起動しようとしたときに、次のことが判明しましたstd::async によって返される std::future のデストラクターはブロック動作を示します。これにより、この設計決定の背後にある理論的根拠と、利便性と効率性を向上させることができるかどうかについて疑問が生じました。
ブロッキング デストラクターの引数
によって対処される主な懸念事項の 1 つブロッキング デストラクターは「暴走」スレッドを防止します。関連するスレッドの完了を待たずに std::future が破棄された場合、予期しない動作や潜在的なメモリ破損が発生する可能性があります。
Hans Boehm の論文 (N3679) で説明されているように、この問題は次の場合に発生する可能性があります。スレッドはすでに破棄されたデータを操作します。ブロッキング デストラクターがないと、スレッドが引き続きそのデータにアクセスして変更する可能性があり、クロススレッド メモリの問題が発生する可能性があります。
代替アプローチ
次のことを提案する人もいます。 get メソッドまたは wait メソッドが常に結果を取得するか完了を待つために呼び出される場合は、非ブロッキング デストラクターで十分です。しかし、明示的な呼び出しに依存すると見落とされやすく、セキュリティ上の脆弱性につながる可能性があるとベーム氏は主張します。実行中の例外などの例外的な状況では、そのような呼び出しがバイパスされ、暴走スレッドが作成される可能性があります。
現在の状況と今後の展開
内部で継続的な議論にもかかわらず、 C 標準委員会、C 14 の std::future デストラクターのブロック動作については変更の予定はありません。ただし、この問題はまだ検討中であり、C の将来のバージョンではこの動作に対応する可能性があります。
実践のための推奨事項
デストラクターのブロックに関連する潜在的な問題を回避するには、std::async によって返された std::future を破棄する前に、常に get を呼び出すか待機することをお勧めします。これにより、関連付けられたスレッドの実行が完了し、必要なリソースがすべて解放されたことが保証されます。
以上が`std::async` によって返される `std::future` デストラクターがブロックされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。