【问题标题】:Is std::coroutine_handle thread safe in any way?std::coroutine_handle 线程是否安全?
【发布时间】:2021-07-05 18:19:13
【问题描述】:

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

例如,我可以看到 std::coroutine_handle::done() 使用原子变量实现,这将允许在不首先锁定所有内容的情况下进行完成检查。

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

【问题讨论】:

  • 我没有找到任何确定的东西,但是有一条注释说,“协同程序的并发恢复可能会导致数据竞争。”

标签: c++ c++20 c++-coroutine


【解决方案1】:

coroutine_handle 的所有函数都未指定为不引发数据竞争。因此,标准库的通用规则适用:同时调用具有对象的任何函数会引发对该对象的数据竞争,除非所有可能冲突的函数通过const 指针/引用(如const 成员)访问该对象。

观察者,例如explicit operator bool()done 都是const,因此不会引发数据竞争,除非正在调用其他非const 函数。当然,operator()resume() 都不是const,因此会引发与观察者的数据竞争。但是,观察者的前提条件是相关句柄被挂起,因此无论如何您都不能真正这样做。

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

【讨论】:

    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 2018-03-31
    • 2013-02-10
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多