Вызов функции std :: async внутри синхронной функции в C ++ [duplicate]

Проверьте функцию Matlab EPS .

Matlab использует математику с плавающей запятой до 16 цифр точности (отображается только 5).

8
задан Ling He 23 April 2016 в 21:57
поделиться

1 ответ

Из encppreference.com :

Если std::future, полученный из std::async, не перемещается из ссылки или не привязывается к ссылке, деструктор std::future будет блокироваться в конце полного выражения до тех пор, пока не завершится асинхронная операция, по существу сделав код, такой как следующий синхронный:

std::async(std::launch::async, []{ f(); }); // temporary's dtor waits for f()
std::async(std::launch::async, []{ g(); }); // does not start until f() completes

Если бы я понял это правильно, это происходит из эти части стандарта (N4527):

§30.6.6 [futures.unique_future]:

~future();

Эффекты:

- освобождает любое общее состояние (30.6.4);

§30.6.4 # 5 [futures.state] (выделение мое):

Когда говорят, что асинхронный возвращаемый объект или асинхронный провайдер освобождают его общее состояние, это означает:

[...] .

- эти действия не будут блокировать для состояния общего состояния, чтобы быть готовым, за исключением того, что он может блокироваться, если все следующие являются истинными: общее состояние было создано вызовом std :: async, общее состояние - n ot еще не готов, и это была последняя ссылка на общее состояние.

Поскольку вы не сохранили результат своего первого вызова std::async, деструктор std::future вызывается и поскольку все 3 условия выполнены:

  • std::future был создан через std::async;
  • общее состояние еще не готово (из-за вашего бесконечного цикла);
  • нет никакой ссылки на это будущее

... тогда вызов блокируется.

11
ответ дан Holt 19 August 2018 в 18:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: