std :: async - std :: запуск :: async | std :: запуск :: deferred
Вопрос
Я понимаю, что std::async
Делает со следующими параметрами.
std::launch::async
std::launch::deferred
Однако, с чем происходит, std::launch::async | std::launch::deferred
?
Решение
Политика запуска std::launch::async | std::launch::deferred
означает, что реализация может выбрать, следует ли применять политику std::launch::async
или же std::launch::deferred
. Анкет Этот выбор может варьироваться от вызова к вызову, и не может быть решено немедленно.
Реализация, которая всегда выбирает одно или другое, является законной (что делает GCC, всегда выбирая отложенные), как и тот, который выбирает std::launch::async
Пока не будет достигнут какой -то предел, а затем не переключается на std::launch::deferred
.
Это также означает, что реализация может отложить выбор до позже. Это означает, что реализация может подождать, чтобы принять решение до тех пор, пока его рука не будет вынуждена вызовом, который имеет явно отличные эффекты от отложенных и асинхронных задач, или до тех пор, пока количество выполняемых задач не будет меньше, чем внутренний предел задачи. Это то, что Просто :: Тема делает.
Функции, которые заставляют это решение: wait()
, get()
, wait_for()
, wait_until()
, и деструктор последнего будущего объекта, ссылаясь на результат.
Другие советы
Chaprer 30.6.8 из ISO IEC 14882-2011 объясняет, что launch::async | launch::deferred
означает implementations should defer invocation or the selection of the policy when no more concurrency can be effectively exploited
(такой же как async
без policy
параметр).
На практике это означает, что время выполнения C ++ должно запустить новые потоки для каждого async
Пока есть неиспользованные ядра процессора.