是否需要从C++中的调用函数恢复协同例程



我有一个关于在C++中使用co-await的问题。我有以下代码片段:-

// Downloads url to cache and
// returns cache file path.
future<path> cacheUrl(string url)
{
cout << "Downloading url.";
string text = co_await downloadAsync(url); // suspend coroutine
cout << "Saving in cache.";
path p = randomFileName();
co_await saveInCacheAsync(p, text); // suspend coroutine
co_return p;
}
int main(void) {
future<path> filePath = cacheUrl("https://localhost:808/");

return 0; 
}

co_await关键字用于挂起任何协同例程的执行。在上面的代码中,我们有两个使用它的实例。在主函数中,我们可以访问协同例程。当程序执行行co_await downloadAsync(url)时,它将调用downloadAsync或只是挂起协同例程。此外,为了执行下一个saveInCacheAsync(p, text)函数,主函数调用是否应该在协同例程上继续?还是会自动调用?

C++中的协程模型是不透明的:协程的调用者将其视为一个普通的函数调用,同步地返回声明类型的值(此处为future<path>(。不过,这个值只是一个占位符:函数体只有在等待结果时才执行——但不一定是co_awaited,因为调用方不需要是协程(再次是不透明度(。

另外,co_await可以挂起协程,但不必这样做(考虑到它可能正在"等待"具有空函数体的协程(。它与调用协同程序也非常分离:可以编写

auto cr=coroutine(…);
do_useful_work();
co_await cr;

在使用占位符之前创建占位符。

C++中的

co_await是一个运算符,就像前缀*或其他什么一样。如果您看到*downloadAsync(...),您会期望函数调用发生,那么*运算符将对该函数返回的值执行操作。co_await也是如此。

downloadAsyncsaveInCacheAsync返回的对象中应该有一些机制,以确定在异步进程结束后何时何地继续执行协程。co_await表达式(潜在地(挂起协程的执行,然后访问这些机制,用该机制调度协程执行的恢复。

协程函数定义的future对象返回值旨在将函数中的co_returned值引导给任何需要它的人。它的工作原理完全取决于您如何为协程编写promise/future机制。

处理它的典型方法是能够阻止请求该值的线程(例如,使用mutex(,直到异步进程完成该值的计算。但它可以做其他事情。事实上,能够在这些事情上co_await,从而形成异步连续的长链来构建更复杂的值,是大多数协程机制的常见部分。

但在某种程度上,必须有人实际检索所有这些结果的值。

最新更新