如果我有一个向量:
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
操作是在原子对象上执行的,因此它不可能与任何对象竞争。