ホームページ >バックエンド開発 >C++ >std::async フューチャーにブロッキング デストラクターがあるのはなぜですか?

std::async フューチャーにブロッキング デストラクターがあるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-19 11:12:13322ブラウズ

Why Do std::async Futures Have Blocking Destructors?

なぜブロックされるのか: std::async によって返される Future のデストラクターをブロックする背後にある理由

非同期タスクを扱う場合、 std::async によって返される Future はそのブロック動作で注目されており、その必要性について疑問が生じています。この設計の選択を詳しく調べるために、その実装に至った懸念と議論を見てみましょう。

Herb Sutter の論文「async、~future、および ~thread」では、デストラクタのブロックに関連する安全性の考慮事項が強調されています。この動作がないと、フューチャーに関連付けられた「暴走」スレッドは、関連付けられた状態が破棄された後も実行を続ける可能性があります。タスクの完了を制御できないことにより、メモリ破損やその他の予期せぬ問題が発生する可能性があります。

Hans Boehm の論文「Async() future destructors should wait」は、この懸念の具体例を示しています。デストラクターをブロックしないと、例外処理や外部イベントによって、予想されるタスク実行のフローが中断される可能性があります。 Boehm 氏が指摘しているように、これによりセキュリティ上の脆弱性が生じ、攻撃者が例外のタイミングを操作してスコープ ガードの見落としを悪用し、スタックの上書きやプロセス ハイジャックにつながる可能性があります。

ブロッキング デストラクターは、セキュリティに対する安全策として機能します。これらの潜在的な危険により、フューチャーが破棄された後、関連するスレッドが実行を継続できなくなります。ただし、この動作は、非同期起動ポリシーを使用して std::async によって返される Future に固有であることに注意することが重要です。 std::promise によって返されるフューチャーや並列アルゴリズムから返されるフューチャーなど、他のフューチャーは、デストラクターで同じブロック動作を示しません。

安全性に関する懸念があるにもかかわらず、std::async フューチャーのブロッキング デストラクターは、これは、C 標準化委員会内で進行中の議論のテーマです。ブロッキング動作を非推奨にしたり、非同期フューチャーの非標準にするための変更案は受け入れられていません。

要約すると、std::async によって返されるフューチャーのブロッキング デストラクターは、安全性への懸念から物議を醸す設​​計上の選択です。 。これにより、制御されていないスレッドの実行に関連する潜在的な問題が防止されますが、適切なクリーンアップを確保するために、スレッドのライフサイクルとスコープ ガードを明示的に管理する必要性も生じます。

以上がstd::async フューチャーにブロッキング デストラクターがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。