atomic bool Vector的线程安全

Thread safety of Vector of atomic bool

如果我有一个向量:

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

假设我不会修改它的大小post创建,调用线程安全吗:

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:

For purposes of avoiding data races (16.5.5.10), implementations shall consider the following functions to be const: begin, end, rbegin, rend, front, back, data, find, lower_bound, upper_bound, equal_range, at and, except in associative or unordered associative containers, operator[].

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