VS2013では、std::async
はC++標準に準拠していません。
MSVCで作業している開発者は、std::async
のstd::future
が他のすべてと同様に動作するようにしたいとの意見がありましたstd::future
。
規格には異論があります。
彼らは2013年に非標準準拠のstd::future
をリリースしました.2015年に正しく覚えていれば、彼らは標準に準拠し始めました。
標準では、std::async(std::launch::async
によって生成された共有状態を所有するstd::future
のデストラクタが、タスクが完了するまでブロックされることを示しています。
これは、予測可能な振る舞いをするプログラムでは、実際にはスレッドが絡んでいるためです。あなたはfuture
を所有し、持続の担当に今ある
は、あなたがそれを準備する必要がある場合にそれをINGの
auto f = std::async(std::launch::async, myfunction, this);
とf.wait
またはf.get
から返されました。
コードの変更方法が必要な場合があります。 (複数の場合は)先読みベクトルを保持するか、またはstd::future<?>
メンバをthis
に追加して保存します(これにより、非同期呼び出しがオブジェクトの存続期間を超えないようにすることもできます)。 2番目の音符として
は、Windows上の
std::async
も有界スレッドプールを使用しています。特定の数以上の
async
タスクがアクティブな場合、新しいタスクが起動されないことがあります。
彼らはそれを修正する計画があります(これは標準のアドバイスに反します)。しかし、この時点ではstd::thread
を使用することをお勧めします。std::async
のような動作が必要です。
私の個人的な傾向がstd::thread
秒の一定数を所有し、問題固有のthread_pool
Sを作成していますが、タスクをキューに入れましょうと戻ってそれからfuture
S(私は非常に限られた継続能力を与えるカスタム拡張子を持つ)を取得することです。
スレッド所有権と依存関係をより明示的にし、依然として存在するMSVC非標準準拠の処理を回避します。
あなたがリリースまたはデバッグビルドでテストされていますか? –
@FrançoisAndrieuxDebug – TheRealLife
'myfunction'にブレークポイントを配置すると、ワーカースレッドでブレークポイントが実行されていることがわかります。 –