如何解决std::coroutine_handle 线程是否安全?
是否有 std::coroutine_handle
的任何部分在标准中被定义为线程安全的?
例如,我可以看到 std::coroutine_handle::done()
使用原子变量实现,这将允许完成检查而无需先锁定所有内容。
但如果标准中没有定义与线程安全相关的任何内容,那么我将不得不假设最坏的情况并始终锁定所有内容。
解决方法
coroutine_handle
的所有功能均未指定为不引发数据竞争。因此,适用标准库的通用规则:同时调用具有对象的任何函数都会引发对该对象的数据竞争,除非所有潜在冲突的函数都通过 const
指针/引用(如 const
成员)访问该对象.
观察者,例如 explicit operator bool()
和 done
都是 const
,因此不会引发数据竞争,除非其他非{{1} }} 函数被调用。当然,const
和 operator()
都不是 resume()
,因此会引发与观察者的数据竞争。然而,观察者的前提是有问题的句柄被挂起,所以无论如何你都不能真正做到这一点。
实际上,您不应该一开始就尝试同时访问句柄。承诺类型应该管理这些场景的句柄,未来和句柄之间的任何交互都应该通过承诺发生。如果需要并发交互,promise 可以提供。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。