std::coroutine_handle 线程安全吗?

Is std::coroutine_handle thread safe in any way?

std::coroutine_handle 中是否有任何部分在标准中被定义为线程安全的?

例如,我可以看到 std::coroutine_handle::done() 是用原子变量实现的,这将允许完成检查而无需首先锁定所有内容。

但是如果标准中没有定义任何与线程安全相关的内容,那么我将不得不假设最坏的情况并始终锁定所有内容。

None 的 coroutine_handle 函数被指定为不引发数据竞争。因此,标准库的通用规则适用:同时调用一个对象的任何函数都会在该对象上引发数据竞争,除非所有潜在冲突的函数都通过 const pointer/reference(如 const成员)。

观察者,例如explicit operator bool()done都是const,因此不会引发数据竞争,除非其他,正在调用非 const 函数。当然,operator()resume() 都是非 const,因此会引发与观察者的数据竞争。但是,观察者有一个前提条件,即有问题的句柄被挂起,所以你不能真的那样做。

不过,实际上,您不应该一开始就尝试同时访问一个句柄。 promise 类型应该管理这些场景的 handle,未来和 handle 之间的任何交互都应该通过 promise 发生。如果需要并发交互,promise可以提供。