[c++] В чем разница между packaged_task и async


0 Answers

«Шаблон класса std :: packaged_task обертывает любую вызываемую цель (функцию, лямбда-выражение, выражение привязки или другой объект функции), так что он может быть вызван асинхронно. Возвращаемое значение или генерируемое исключение хранится в общем состоянии, к которому можно получить доступ через std :: будущие объекты. "

«Функция async шаблона запускает функцию f асинхронно (потенциально в отдельном потоке) и возвращает std :: future, которая в конечном итоге приведет к результату вызова этой функции».

Question

Во время работы с проточной моделью 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 , но есть ли в этом случае?

В чем разница между этими двумя подходами и, что более важно, в каких вариантах использования я должен использовать один над другим?




Related