【问题标题】:Thread safety of Vector of atomic bool原子布尔向量的线程安全
【发布时间】:2021-11-17 05:12:36
【问题描述】:

如果我有一个向量:

std::vector<std::atomic_bool> v(8);

并且假设我不会在创建后修改它的大小,调用它是否线程安全:

bool result = v[2].compare_exchange_strong(false, true);
* 值 8、2、false 和 true 仅作为示例用例给出。

【问题讨论】:

  • 取决于你的目标。 v[2] 可以在阅读后立即更改,然后才能使用result
  • 是的,调用此函数是安全的(如 - 效果已明确定义)。但是,您可能需要一个循环和 compare_exchange_weak。
  • @user4581301 即使是独立的std::atomic_bool 也是如此,对吧?
  • @user4581301 结果是CAS操作是否成功,而不是v[2]的值
  • 我很抱歉,但结果是一样的。 function 是安全的,但您对它的使用可能不安全。

标签: c++ multithreading thread-safety


【解决方案1】:

OP 似乎在询问是否可以评估多个线程

v[2].compare_exchange_strong(false, true)

当此类评估可能并发时,不会导致数据竞争。

这不会编译,因为compare_exchange_strong 需要一个左值作为它的第一个参数。我会假设这个问题已经得到纠正。

答案是肯定的。根据[container.requirements.dataraces]/1:

为了避免数据竞争 (16.5.5.10),实现应将以下函数视为 constbeginendrbeginrendfrontbackdatafindlower_boundupper_boundequal_rangeat 以及,除了在关联或无序关联容器中,operator[]

这意味着评估 v[2] 不允许修改向量(也不允许在线程之间共享任何内部静态数据),因此可能不会在另一个线程中与相同的评估竞争。 compare_exchange_strong 操作是在一个原子对象上执行的,所以它不可能与任何东西竞争。

【讨论】:

  • +1 尽管我有一个注释提到值 8、2、false 和 true 只是一个示例。这个demo 是等价的。感谢您 ping 指出,这一切都归结为 operator[]const 和相关报价。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多