2015-07-06 2 views
5

Когда поток создается с политикой запуска установленной в std::launch::async, описание дано на cppreference являетсяКогда выполняется std :: future?

новый поток запускается для выполнения задачи асинхронно

Если у меня есть некоторые произвольные функции

double Foo(double i) 
{ 
    return i * 5.0; 
} 

И я настроить async вызов, как так

std::vector<double> values{5.0, 2.3, 7.1, 4.8, 1.5}; 
std::vector<std::future<double>> answers; 
for (double value : values) 
{ 
    answers.push_back(std::async(std::launch::async, 
           Foo, 
           value)); 
} 

Когда я называю std::accumulate вот так:

double total = std::accumulate(begin(answers), 
           end(answers), 
           0.0, 
           [](double x, std::future<double>& t){return x + t.get();}); 

Когда каждый из потоков пнуть их исполнение? Они начали, как только они были добавлены в answers? Или они ждут, пока не будут вызваны их get? Если это так, я просто заставляю их выполнять последовательно, так как их get вызывается в порядке выполнения accumulate? Другими словами, я просто трачу свое время на создание этих фьючерсов, а затем заставляю их работать синхронно?

Примечание
Функция Foo была только несколько примеров, фактическая функция я использую делает больше работы.

+0

'get' ждет, пока не будет доступен результат. – njzk2

ответ

4

На практике они запускаются при создании future. Он может быть запланирован только для выполнения или может быть начат до вызова async.

Возможно, существует некоторая попытка сохранить только определенное количество потоков, выполняемых одновременно (по крайней мере, на начальном этапе) с пулом потоков и т. Д., Но это проблема с качеством реализации, и это право, не будучи более навязчивым или требующим больше от вызываемой функции сложно.

В стандарте нет ничего близкого к этому уровню поведения, но на практике async asyncs на самом деле является асинхронным.

1

Потоки стартуют, как только вы позвоните std::async. Таким образом, ваши потоки будут выполняться одновременно.

Цитирую cpp-reference:

Если флаг асинхронной установлен, затем асинхронной выполняет функцию п на новом потоке исполнения ((т.е. политика & станд :: запуск :: асинхронной = 0!) с инициализированы все нитки-локали), как если бы они были порождены std :: thread (f, args ...), за исключением того, что если функция f возвращает значение или генерирует исключение , оно сохраняется в общем состоянии, доступном через std :: future, что async возвращает вызывающему.

+2

Спецификация, как правило, не интерпретировалась как подразумевающая график выполнения, а только обещание параллелизма, и поэтому реализации могут использовать пул потоков.'Функция async шаблона выполняет функцию f асинхронно (потенциально в отдельном потоке, который может быть частью пула потоков) и возвращает std :: future, которая в конечном итоге приведет к результату вызова этой функции.' (Http: // en .cppreference.com/w/cpp/thread/async) – kfsone

+0

@kfsone Да, но что вы хотите подразумевать этим в контексте вопроса? – inf

+2

Вопрос был отредактирован с вашего ответа, но дело в том, что потоки * не * гарантированно начинаются мгновенно. Может быть очередь. – kfsone

Смежные вопросы