ホームページ > バックエンド開発 > C++ > `std::async` によって返される `std::future` デストラクターがブロックされるのはなぜですか?

`std::async` によって返される `std::future` デストラクターがブロックされるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-15 14:26:02
オリジナル
935 人が閲覧しました

Why Does the `std::future` Destructor Returned by `std::async` Block?

std::async によって返される std::future デストラクターの性質をブロックする

タスクを非同期で起動しようとしたときに、次のことが判明しましたstd::async によって返される std::future のデストラクターはブロック動作を示します。これにより、この設計決定の背後にある理論的根拠と、利便性と効率性を向上させることができるかどうかについて疑問が生じました。

ブロッキング デストラクターの引数

によって対処される主な懸念事項の 1 つブロッキング デストラクターは「暴走」スレッドを防止します。関連するスレッドの完了を待たずに std::future が破棄された場合、予期しない動作や潜在的なメモリ破損が発生する可能性があります。

Hans Boehm の論文 (N3679) で説明されているように、この問題は次の場合に発生する可能性があります。スレッドはすでに破棄されたデータを操作します。ブロッキング デストラクターがないと、スレッドが引き続きそのデータにアクセスして変更する可能性があり、クロススレッド メモリの問題が発生する可能性があります。

代替アプローチ

次のことを提案する人もいます。 get メソッドまたは wait メソッドが常に結果を取得するか完了を待つために呼び出される場合は、非ブロッキング デストラクターで十分です。しかし、明示的な呼び出しに依存すると見落とされやすく、セキュリティ上の脆弱性につながる可能性があるとベーム氏は主張します。実行中の例外などの例外的な状況では、そのような呼び出しがバイパスされ、暴走スレッドが作成される可能性があります。

現在の状況と今後の展開

内部で継続的な議論にもかかわらず、 C 標準委員会では、C 14 の std::future デストラクターのブロック動作については変更の予定はありません。ただし、この問題は引き続き検討中です。 C のバージョンは、この動作に対処する可能性があります。

実践のための推奨事項

デストラクターのブロックに関連する潜在的な問題を回避するには、破棄する前に常に get または wait を呼び出すことをお勧めします。 std::async によって返される std::future。これにより、関連付けられたスレッドが実行を完了し、必要なリソースがすべて解放されたことが保証されます。

以上が`std::async` によって返される `std::future` デストラクターがブロックされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート