フューチャーのデストラクターが std::async ブロッキングから返されるのはなぜですか?
C 11 では、フューチャーのデストラクターは次のように返されます。 std::async がブロックされ、デッドロックが発生する可能性があります。この行為は懸念を引き起こし、標準化委員会内で一連の提案や議論が行われました。
問題の核心は、スレッドの安全性を確保することにあります。ブロック動作がないと、フューチャーが破棄された後も関連付けられたスレッドが実行され続け、その完了を同期する方法がなくなるという状況が発生する可能性があります。これにより、メモリ破損が発生したり、システム セキュリティが侵害されたりする可能性があります。
N3679 で Hans Boehm が説明したように、このシナリオは、完了を待つことを目的としたコードをバイパスする可能性のある未処理の例外によって悪化します。したがって、ブロッキング デストラクターはセーフティ ネットとして機能し、そのような壊滅的な結果を防ぎます。
広範な検討にもかかわらず、C コミュニティはこの問題について合意に達していません。 C 14 の時点では、std::future と std::thread のデストラクターはブロックされたままです。
ただし、状況は将来的に発展する可能性があります。 Michael Wong の 2013 年の旅行レポートによると、std::async を非推奨にする運動は失敗に終わりましたが、そのブロック動作によってもたらされる潜在的な危険性についての認識が高まっていることがわかります。
それまでの間、プログラマーはこの点に注意する必要があります。から返された先物を扱うときにスレッドの安全性を確保するために、スコープ ガードや明示的な同期メカニズムなどの適切な手段を発行および採用します。 std::async.
以上が`std::async` のデストラクターが Future をブロックするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。