std :: async - std :: launch :: async |станд :: запуск :: отложено - PullRequest
6 голосов
/ 20 февраля 2012

Я понимаю, что std::async делает со следующими параметрами.

  • std::launch::async
  • std::launch::deferred

Однако, что происходит с std::launch::async | std::launch::deferred?

Ответы [ 2 ]

9 голосов
/ 20 февраля 2012

Политика запуска std::launch::async | std::launch::deferred означает, что реализация может выбрать, применять ли политику std::launch::async или std::launch::deferred.Этот выбор может варьироваться от звонка к звонку и не может быть решен немедленно.

Реализация, которая всегда выбирает одну или другую, является, таким образом, законной (что делает gcc, всегда выбирая отложенную), как и та, котораявыбирает std::launch::async до тех пор, пока не будет достигнут некоторый предел, а затем переключается на std::launch::deferred.

Это также означает, что реализация может отложить выбор на более поздний срок.Это означает, что реализация может ожидать принятия решения, пока ее рука не будет вызвана вызовом, который имеет явно различимые эффекты от отложенных и асинхронных задач, или пока количество запущенных задач не станет меньше внутреннего предела задачи.Это то, что just :: thread делает.

Функции, которые вызывают принятие решения: wait(), get(), wait_for(), wait_until() и деструкторпоследний объект будущего, ссылающийся на результат.

3 голосов
/ 20 февраля 2012

Глава 30.6.8 ИСО МЭК 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, если имеются неиспользуемые ядра ЦП.

...