首页 > 解决方案 > 原子布尔向量的线程安全

问题描述

如果我有一个向量:

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

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

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

标签: c++multithreadingthread-safety

解决方案


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

v[2].compare_exchange_strong(false, true)

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

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

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

为了避免数据竞争(16.5.5.10 ),实现应考虑以下功能const:_beginendrbeginrendfrontbackdatafindlower_boundupper_boundequal_rangeatoperator[]

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


推荐阅读