从多个线程调用 `std::shared_future<T>::wait`

问题描述 投票:0回答:1

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
方法可能会导致竞争条件?

c++ multithreading thread-safety language-lawyer
1个回答
0
投票
从多个线程在

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中删除了。

© www.soinside.com 2019 - 2024. All rights reserved.