std::coroutine_handle是否存在标准规定的线程安全特性?
C++标准中std::coroutine_handle的线程安全特性说明
现行C标准(C20及更新版本)并未对std::coroutine_handle的任何成员函数作出线程安全的强制规定。
std::coroutine_handle的设计定位是零开销的协程抽象层包装,所有成员函数默认都不要求线程安全,标准没有强制done()、resume()、destroy()等接口采用原子实现,也不担保这些操作的跨线程可见性。- 部分厂商的标准库实现可能会自行扩展特性,比如用原子变量存储协程执行状态,此时跨线程调用
done()不会触发数据竞争,但这类实现细节不具备通用性,不能作为跨平台代码的依赖依据。 - 按照标准定义,只要存在多线程同时访问同一个
std::coroutine_handle实例的操作(无论读写),且没有额外同步机制兜底,就属于未定义行为。
工程实践中如果有跨线程操作协程句柄的需求,包括跨线程检查协程是否执行完成,不要依赖特定实现的隐性特性,必须自行通过互斥锁、独立原子状态标记等同步手段保证操作安全,才能避免出现兼容性问题。
内容的提问来源于stack exchange,提问作者Rick de Water
相关产品推荐
相关产品推荐

