原子bool类型Vector的线程安全性



如果我有一个向量:

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

假设我不会在创建后修改其大小调用

是线程安全的吗?
bool result = v[2].compare_exchange_strong(false, true);
*值8,2,false和true只是一个示例用例。

OP似乎在询问多个线程是否可以计算

v[2].compare_exchange_strong(false, true)

当这些计算可能是并发的,而不会引起数据竞争时

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

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

为了避免数据争用(16.5.5.10),实现应该考虑以下函数为const:begin,end,rbegin,rend,front,back,data,find,lower_bound,upper_bound,equal_range,at,以及operator[],除了在关联或无序关联容器中,

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