我可以在await_suspend期间调用coroutine_handle::恢复吗?
Can I call coroutine_handle::resume during await_suspend?
请考虑以下代码:
coroutine_handle<> g_handle;
atomic<int> g_ready;
void worker_thread() {
if (++g_ready == 2) g_handle.resume();
}
struct Awaitable {
bool await_ready() const { return false; }
bool await_suspend(coroutine_handle<> h) {
g_handle = h;
if (++g_ready == 2) return false;
// worker_thread can call h.resume() at this point
return true;
}
void await_resume() {}
};
Future coroutine() {
Awaitable a;
std::thread(worker_thread).detach();
co_await a; // compiles as:
// if (a.await_suspend(h)) {
// // worker_thread can call h.resume() at this point
// return;
// }
}
在这里,当协程仍在await_suspend
或协程中的await_suspend()
和return
之间执行时,worker_thread
可以调用h.resume();
。
协程TS 表示,只有在协程挂起时才能调用resume
。
在执行await_suspend
期间是否被视为暂停?
是的,链接的协程 TS 的文本指出,5.3.8 第 3-5 段。强调我的:
5 等待表达式计算等待就绪表达式,然后: —
(5.1( 如果结果为假,则协程被视为暂停。然后,计算等待挂起表达式。 如果 该表达式的类型为 bool 并计算为 false ,协程 已恢复。如果该表达式通过异常退出,则异常 被捕获,协程恢复,异常立即被捕获 重新抛出 (15.1(。否则,控制流返回到当前 调用方或恢复器 (8.4.4(,而不退出任何作用域 (6.6(。—
因此,您可以从另一个线程恢复协程,只要您保证退出等待挂起不会导致双重恢复或协程破坏
相关文章:
- 用C++将哈希表写入文件并从文件中恢复
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- Opencv 恢复到比我设置的更高的分辨率
- 变量在使用赋值语句赋值后恢复为以前的值
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 删除所有字符串后如何恢复 QStringList?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- "co_yield"是否可以在恢复协程时从调用方返回值?
- OpenSSL C API:如何在程序exec()之后恢复TLS连接?
- 通过指针恢复对数组的引用.UB与否?
- protobuf C++ SQLite handle blob data
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 如何在 XML 中正确存储原始字节数据并恢复它?
- ExtTextOut 文本的持续闪烁,在一段时间后,文本将恢复为默认字体
- 模板化类中运算符 + 重载的值的恢复
- C++ 线程创建/删除与线程停止/恢复
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- Windows桌面程序保存您的计算机会话 - 基于程序崩溃时的恢复会话
- xSemaphoreTake 在调用 xSemaphoreGive 后不会恢复任务