std :: async -std :: launch :: async | std :: launch :: deferred
質問
私は何を理解しています std::async
次のパラメーターを使用します。
std::launch::async
std::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 IEC 14882-2011のChaprer 30.6.8はそれを説明しています launch::async | launch::deferred
意味 implementations should defer invocation or the selection of the policy when no more concurrency can be effectively exploited
(と同じ async
それなし policy
パラメーター)。
実際には、C ++ランタイムがそれぞれの新しいスレッドを開始することを意味します async
未使用のCPUコアがある限り。