[英]Can I call coroutine_handle::resume during await_suspend?
[英]Is std::coroutine_handle thread safe in any way?
标准中是否有std::coroutine_handle
被定义为线程安全的部分?
例如,我可以看到std::coroutine_handle::done()
使用原子变量实现,这将允许完成检查而无需先锁定所有内容。
但是如果标准中没有定义与线程安全相关的任何内容,那么我将不得不假设最坏的情况并始终锁定所有内容。
coroutine_handle
的所有功能都没有被指定为不引发数据竞争。 因此,标准库的通用规则适用:同时调用具有对象的任何函数会引发对该对象的数据竞争,除非所有潜在冲突的函数都通过const
指针/引用(如const
成员)访问该对象。
观察者,例如explicit operator bool()
和done
都是const
,因此不会引发数据竞争,除非正在调用其他非const
函数。 当然, operator()
和resume()
都是非const
,因此会引发与观察者的数据竞争。 然而,观察者的前提是有问题的句柄被挂起,所以无论如何你都不能真正做到这一点。
但实际上,您不应该一开始就尝试同时访问句柄。 承诺类型应该管理这些场景的句柄,未来和句柄之间的任何交互都应该通过承诺发生。 如果需要并发交互,promise 可以提供。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.