std :: async - std :: запуск :: async | std :: запуск :: deferred

StackOverflow https://stackoverflow.com/questions/9359981

  •  28-10-2019
  •  | 
  •  

Вопрос

Я понимаю, что 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 Пока есть неиспользованные ядра процессора.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top