次のパラメータで何が行われるかを理解してstd::asyncいます。
std::launch::asyncstd::launch::deferred
しかし、どうなるのstd::launch::async | std::launch::deferredでしょうか?
の起動ポリシーはstd::launch::async | std::launch::deferred、実装がまたはのポリシーを適用するかどうかを選択できることstd::launch::asyncを意味しますstd::launch::deferred。この選択は通話ごとに異なる場合があり、すぐに決定されない場合があります。
したがって、常にどちらか一方を選択する実装は合法であり(gccが行うことであり、常に据え置きを選択します)、std::launch::asyncある制限に達するまで選択してからに切り替える実装も同様ですstd::launch::deferred。
また、実装が選択を後回しにすることができることも意味します。これは、実装が、遅延タスクや非同期タスクとは明らかに異なる効果を持つ呼び出しによって強制されるまで、または実行中のタスクの数が内部タスクの制限より少なくなるまで、決定を待つ可能性があることを意味します。これは、just::threadが行うことです。
決定を強制する関数は、、、、、、および結果を参照する最後の将来のオブジェクトのデストラクタですwait()。get()wait_for()wait_until()
ISO IEC14882-2011のChapler30.6.8は、そのlaunch::async | launch::deferred意味を説明しています(パラメーターなしimplementations should defer invocation or the selection of the policy when no more concurrency can be effectively exploitedと同じ)。asyncpolicy
実際には、async未使用のCPUコアがある限り、C++ランタイムはそれぞれに対して新しいスレッドを開始する必要があることを意味します。