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