Я немного запутался в функции std::async
.
В спецификации указано: выполняется асинхронная операция "как в новом потоке выполнения" (С++ 11 §30.6.8/11).
Теперь, что это значит?
В моем понимании код
std::future<double> fut = std::async(std::launch::async, pow2, num);
должен запустить функцию pow2
в новом потоке и передать переменную num
в поток по значению, а затем в будущем, когда функция будет выполнена, поместите результат в fut
(пока функция pow2
имеет такую подпись, как double pow2(double);
). Но спецификация заявляет "как будто", что делает все это для меня туманным.
Возникает вопрос:
В этом случае всегда запускается новый поток? Надеюсь, что так. Я имею в виду для меня параметр std::launch::async
имеет смысл таким образом, что я явно заявляю, что я действительно хочу создать новый поток.
И код
std::future<double> fut = std::async(std::launch::deferred, pow2, num);
должна сделать ленивую оценку возможной, задерживая вызов функции pow2
до точки, где я пишу что-то вроде var = fut.get();
. В этом случае параметр std::launch::deferred
должен означать, что я явно заявляю, что я не хочу новый поток, я просто хочу убедиться, что функция вызывается, когда есть необходимость в ее возврате.
Являются ли мои предположения правильными? Если нет, объясните, пожалуйста.
Кроме того, я знаю, что по умолчанию функция вызывается следующим образом:
std::future<double> fut = std::async(std::launch::deferred | std::launch::async, pow2, num);
В этом случае мне сказали, будет ли запущен новый поток или нет, зависит от реализации. Опять же, , что должно означать?