声明:
bool compare_exchange_weak( T& expected, T desired,
std::memory_order success,
std::memory_order failure ) noexcept;
更新失败时,会将当前 atomic 对象值赋给 expected
例子:
template <typename T>
void UpdateMaximum(std::atomic<T>& maximum_value, T const& value) noexcept {
T prev_value = maximum_value;
while (prev_value < value &&
!maximum_value.compare_exchange_weak(prev_value, value)) {
}
}
compare_exchange_weak
在缺少单条 CAS 操作的机器上,处理器不能保证其能够自动完成,所以即使当原始值与期望值一样时,存储也可能不成功。这称为 “伪失败”。
compare_exchange_strong
保证了原始值与期望值一样时,操作一定成功。
如果不论预期值是什么都需要修改原子变量的值,那么可以循环调用 compare_exchange()
函数。
compare_exchange_weak
能够避免双重循环(compare_exchange_strong
中包含一个循环),即使可能发生伪失败。compare_exchange_strong
能够避免对值的重复计算。用户自定义类型的原子变量有很多严格的限制,对于 std::atomic<MyType>
,MyType
需要:
MyType
, MyType
的所有基类和 MyType
的所有非静态成员的拷贝构造函数必须是 trivial (编译器自动生成的)。MyType
不能具有虚拟方法或基类。MyType
必须按位比较,以便可以应用C函数 memcpy
或 memcmp
。你可以使用 std::is_trivially_copy_constructible
,std::is_polymorphic
和 std::is_trivial
来对其进行约束检查。 这些所有功能都是 type-traits
库的一部分。