私はstd::async
、将来のコンパイラの実装でそれをどのように使用すべきかについて考えてきました。ただし、現在、設計上の欠陥のように感じられるものに少し行き詰まっています。
はstd::async
かなり実装に依存しており、おそらく 2 つのバリアントがlaunch::async
あります。1 つはタスクを新しいスレッドに起動し、もう 1 つはスレッド プール/タスク スケジューラを使用します。
ただし、これらのバリアントのどれを実装するためstd::async
に使用するかによって、使用方法は大きく異なります。
「スレッドプール」ベースのバリアントの場合、オーバーヘッドをあまり気にせずに多くの小さなタスクを起動できますが、ある時点でタスクの 1 つがブロックされたらどうなるでしょうか?
一方、「新しいスレッドを起動する」バリアントは、タスクをブロックしても問題は発生しませんが、タスクの起動と実行のオーバーヘッドは非常に高くなります。
thread-pool: +low-overhead, -決してブロックしない
新しいスレッドを立ち上げます: +ブロックで細かい、-高いオーバーヘッド
したがって、基本的には実装に応じて、使用方法はstd::async
非常に慎重になります。あるコンパイラで問題なく動作するプログラムがある場合、別のコンパイラではひどく動作する可能性があります。
これは設計によるものですか?または、何か不足していますか?私と同じように、これを大きな問題と考えますか?
現在の仕様ではstd::oversubscribe(bool)
、実装に依存しないstd::async
.
編集: 私が読んだ限りでは、C++ 11 標準ドキュメントには、送信されたタスクstd::async
がブロックされるかどうかに関するヒントはありません。