C++ 11のスレッドモデルで作業していると、
std::packaged_task<int(int,int)> task([](int a, int b) { return a + b; });
auto f = task.get_future();
task(2,3);
std::cout << f.get() << '\n';
そして
auto f = std::async(std::launch::async,
[](int a, int b) { return a + b; }, 2, 3);
std::cout << f.get() << '\n';
まったく同じことをするようです。 std::async
でstd::launch::deferred
を実行した場合、大きな違いが生じる可能性があることを理解していますが、この場合はありますか?
これら2つのアプローチの違いは何ですか?さらに重要なことは、どのユースケースで一方をもう一方に使用する必要があるかです?
p>パッケージ化されたタスクは、タスク_[function or function object]
_とfuture/promiseのペアを保持します。タスクがreturnステートメントを実行すると、_packaged_task
_のpromiseでset_value(..)
が発生します。
a> Future、promise、packageタスクを指定すると、スレッドについてあまり心配することなく簡単なタスクを作成できます[スレッドは単なるものですタスクを実行するために与えます]。
ただし、使用するスレッドの数、または現在のスレッドで実行するのが最適かどうかなどを考慮する必要があります。このような決定は、async()
というスレッドランチャーで処理できます。新しいスレッドを作成するか、古いスレッドをリサイクルするか、単に現在のスレッドでタスクを実行します。未来を返します。
「クラステンプレートstd :: packaged_taskは、呼び出し可能なターゲット(関数、ラムダ式、バインド式、または別の関数オブジェクト)をラップするため、非同期で呼び出すことができます。その戻り値またはスローされる例外は、アクセス可能な共有状態で格納されますstd :: futureオブジェクトを使用します。」
「テンプレート関数asyncは、関数fを非同期で(場合によっては別のスレッドで)実行し、その関数呼び出しの結果を最終的に保持するstd :: futureを返します。