Будущее с сопрограммами co_await - PullRequest
0 голосов
/ 15 апреля 2020

Смотря лекцию на c ++ (https://youtu.be/DLLt4anKXKU?t=1589), я пытался понять, как в будущем работать с co_await; пример:

auto compute = []() -> std::future<int> {
int fst = co_await std::async(get_first);
int snd = co_await std::async(get_second);
co_return fst + snd;
};
auto f = compute();
/* some heavy task */ 
f.get();

Я не могу понять, как и когда co_await std::async(get_first) возвращает управление на compute. то есть как std::future реализует ожидаемый интерфейс (тип).

1 Ответ

0 голосов
/ 15 апреля 2020

как std :: future реализует ожидаемый интерфейс

Что касается C ++ 20, то не . C ++ 20 предоставляет co_await и его сопутствующие языковые функциональные возможности, но не предоставляет никаких реальных ожидаемых типов.

Как std::future может реализовать ожидаемый интерфейс, в основном то же самое как std::experimental::future из Concurrency TS реализует future::then. then принимает функцию для продолжения, когда становится доступным значение future. Возвращаемое значение then - это новое future<U> (старое future<T> теперь перестает функционировать), где U - это новое значение, которое возвращает данная функция продолжения. У этого нового future будет U доступным только тогда, когда доступно исходное значение и когда продолжение обработало его в новое значение. В таком порядке.

Точные детали того, как работает .then, полностью зависят от того, как реализован future. И это может зависеть от того, как спецификации c future были созданы , так как future s из std::async имеют специальные свойства, которые другие future s не имеют.

co_await только делает этот процесс намного более удобочитаемым визуально. co_await способное будущее просто толкнет ручку сопрограммы в future::then, тем самым изменив future.

...