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