C++ 我可以在等待期间调用coroutine\u handle::resume\u suspend吗?

C++ 我可以在等待期间调用coroutine\u handle::resume\u suspend吗?,c++,coroutine,c++20,c++-coroutine,C++,Coroutine,C++20,C++ Coroutine,考虑以下代码: 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)

考虑以下代码:

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;
              // }
}
coroutine\u handle\u handle;
原子g_就绪;
无效工作线程(){
如果(++g_ready==2)g_handle.resume();
}
结构等待{
bool wait_ready()常量{return false;}
bool WAIT_suspend(协程_句柄h){
g_handle=h;
如果(++g_ready==2),则返回false;
//此时,辅助线程可以调用h.resume()
返回true;
}
void wait_resume(){}
};
未来协同程序(){
等待的一天;
std::thread(worker_thread).detach();
co_wait a;//编译为:
//如果(a.wait_suspend(h)){
////此时,辅助线程可以调用h.resume()
//返回;
// }
}
在这里,
worker_线程
可以调用
h.resume()当协同程序仍在执行时,或者在协同程序中的
wait_suspend
wait_suspend()
return
之间执行

说明只有在挂起协同程序时才能调用
resume


在执行
wait_suspend
的过程中是否被视为已暂停?

是的,链接的协同程序的文本TS状态,5.3.8第3-5段。重点地雷:

5等待表达式计算等待就绪表达式,然后:-

(5.1)如果结果为false,则认为协同路由已挂起。然后,将计算等待挂起表达式。如果 该表达式的类型为bool,计算结果为false,即协同路由 恢复。如果该表达式通过异常退出,则异常 捕获时,将恢复协同路由,并立即执行异常 重新抛出(15.1)。否则,控制流将返回到当前值 调用方或恢复方(8.4.4),但不退出任何作用域(6.6)-

因此,您可以从另一个线程恢复协同路由,只要您保证退出wait-suspend不会导致双重恢复或破坏协同路由