cppreference 明确地从多个线程调用
std::shared_future<T>::wait
:
从多个线程调用同一个 std::shared_future 的 wait 是不安全的;预期用途是等待相同共享状态的每个线程都拥有 std::shared_future 的副本。
但我找不到这种说法的依据。 标准中没有任何标记
wait
是某种特殊情况。虽然标准规定单个 shared_future
实例上的方法不同步,但只要仅调用 const 方法,您就不需要同步:
[17.6.5.9/3] C++ 标准库函数不得直接或间接修改当前线程以外的线程可访问的对象 (1.10),除非通过函数的非常量参数直接或间接访问对象,包括这个。
在 SO 上可以找到矛盾的答案。有没有人有这方面的权威资料来解释如何从 stdlib 调用
const
方法可能会导致竞争条件?
wait
实例上调用
shared_future
应该是线程安全的,因为它是一个
const
方法。正如您对标准的引用所表明的那样,标准库保证
const
意味着线程安全。然而,不安全的是调用非
const
方法,例如
operator=
,类似于
shared_ptr
。这可能是在每个线程中始终保留
shared_future
副本以防止意外引入数据竞争的原因之一。对于其他上下文,曾经存在一个
atomic_future
,它本质上是
shared_future
的原子版本,可以在多个线程之间安全共享。根据N2997:
之所以需要但是,
atomic_future
,是因为移动构造函数和两个赋值使得shared_future
在使用来自多个线程的单个实例时更容易出错。但是,当多个线程扫描全局 future 列表以获取工作线程提供的结果时,就需要这种使用。
atomic_future
由于其接口不令人满意而在N3194中从C++11中删除了。