web-dev-qa-db-ja.com

packaged_taskとasyncの違いは何ですか

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::asyncstd::launch::deferredを実行した場合、大きな違いが生じる可能性があることを理解していますが、この場合はありますか?

これら2つのアプローチの違いは何ですか?さらに重要なことは、どのユースケースで一方をもう一方に使用する必要があるかです?

112
nijansen

パッケージ化されたタスクと非同期

p>パッケージ化されたタスクは、タスク_[function or function object]_とfuture/promiseのペアを保持します。タスクがreturnステートメントを実行すると、_packaged_task_のpromiseでset_value(..)が発生します。

a> Future、promise、packageタスクを指定すると、スレッドについてあまり心配することなく簡単なタスクを作成できます[スレッドは単なるものですタスクを実行するために与えます]。

ただし、使用するスレッドの数、または現在のスレッドで実行するのが最適かどうかなどを考慮する必要があります。このような決定は、async()というスレッドランチャーで処理できます。新しいスレッドを作成するか、古いスレッドをリサイクルするか、単に現在のスレッドでタスクを実行します。未来を返します。

2
user5096772

「クラステンプレートstd :: packaged_taskは、呼び出し可能なターゲット(関数、ラムダ式、バインド式、または別の関数オブジェクト)をラップするため、非同期で呼び出すことができます。その戻り値またはスローされる例外は、アクセス可能な共有状態で格納されますstd :: futureオブジェクトを使用します。」

「テンプレート関数asyncは、関数fを非同期で(場合によっては別のスレッドで)実行し、その関数呼び出しの結果を最終的に保持するstd :: futureを返します。

1
Radoslav.B