Ric*_*ter 0 c++ c++20 c++-coroutine
std::coroutine_handle标准中是否有任何部分被定义为线程安全的?
例如,我可以看到std::coroutine_handle::done()使用原子变量来实现,这将允许在不首先锁定所有内容的情况下进行完成检查。
但是,如果标准中没有定义与线程安全相关的内容,那么我将不得不假设最坏的情况并始终锁定所有内容。
没有指定任何函数coroutine_handle不会引发数据争用。因此,标准库的通用规则适用:同时调用对象的任何函数都会引发该对象上的数据竞争,除非所有潜在冲突的函数都通过指针const/引用(如const成员)访问该对象。
观察者,例如explicit operator bool()和done都是const,因此不会引发数据竞争,除非const调用其他非函数。当然,operator()和resume()都是非const,因此可能会引发与观察者的数据竞争。然而,观察者有一个先决条件,即相关句柄已暂停,所以无论如何你都不能真正这样做。
但实际上,您一开始就不应该尝试同时访问句柄。Promise 类型应该管理这些场景的句柄,并且 future 和句柄之间的任何交互都应该通过 Promise 发生。如果需要并发交互,Promise 可以提供。