std::async Futures のブロッキング デストラクター: 技術的な説明
C 11 で std::async を利用してタスクを非同期に実行する場合、返された std::future オブジェクトを破棄するときに、予期しないブロック動作が発生する可能性があります。この記事では、この動作の背後にある理由、その影響、C 標準化委員会内で進行中の議論について詳しく説明します。
std::async から返される std::future のデストラクターは、潜在的な不一致を防ぐために意図的にブロックし、安全上の懸念。 C 標準委員会のメンバーによって発行された論文によると、このブロック動作は、関連するスレッドが参照している std::future より長く存続しないようにするために不可欠です。
このブロック動作がないと、次のようなリスクがあります。 std::future が破棄された後も実行を続ける「暴走」スレッドが作成され、メモリ破損やデータ損失が発生する可能性があります。これは、非同期タスクの実行中に予期しない例外がスローされ、std::future に対する後続の get() または wait() 操作がバイパスされる場合に発生する可能性があります。
このリスクを軽減するには、 std::future のブロッキング デストラクターは、std::future オブジェクトが破棄される前に関連するスレッドが完了することを保証することでセーフティ ネットを提供します。この動作には、プログラマによる明示的な処理が必要です。プログラマは、std::future がスコープ外になる前に、必要な get() または wait() 操作が確実に実行されるようにする必要があります。
非を支持する議論にもかかわらず、デストラクターをブロックするため、C 標準委員会は C 14 でブロック動作を維持することを決定しました。ただし、提案された変更は、コミュニティ内で進行中の議論に基づいて、C 標準の将来の改訂で導入される可能性があります。
以上が`std::async` で `std::future` デストラクターがブロックされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。