【C++编程】函数compare_exchange_strong
compare_exchange_strong
函数原型:
bool compare_exchange_weak(T &expected, T desired, std::memory_order success, std::memory_order failure);
bool compare_exchange_weak(T &expected, T desired, std::memory_order success, std::memory_order failure) volatile;
bool compare_exchange_weak(T &expected, T desired, std::memory_order order = std::memory_order_seq_cst);
bool compare_exchange_weak(T &expected, T desired, std::memory_order order = std::memory_order_seq_cst) volatile;
bool compare_exchange_strong(T &expected, T desired, std::memory_order success = std::memory_order failure);
bool compare_exchange_strong(T &expected, T desired, std::memory_order success = std::memory_order failure) volatile;
bool compare_exchange_strong(T &expected, T desired, std::memory_order order = std::memory_order_seq_cst);
bool compare_exchange_strong(T &expected, T desired, std::memory_order order = std::memory_order_seq_cst) volatile;
该函数会将当前原子变量的值与 expected 进行比较:
- 如果相等,则用 desired 替换原子变量的值,并返回 true。
- 如果不相等:
- 原子变量的值不会被修改。
- expected 会被更新为原子变量当前的值。
- 返回 false。
#include <iostream>
#include <atomic>
int main() {
std::atomic<int> atomic_val(42);
int expected = 42;
int desired = 100;
if (atomic_val.compare_exchange_strong(expected, desired)) {
std::cout << "Update succeeded, new value: " << atomic_val.load() << "\n";
} else {
std::cout << "Update failed, expected was changed to: " << expected << "\n";
}
return 0;
}
输出:
Update succeeded, new value: 100
说明:如果 atomic_val 原来不是 42,那么会输出 “Update failed”。
compare_exchange_weak vs strong:
- compare_exchange_strong: 不容忍伪失败(spurious failure),适用于要求一致性的场景。
- compare_exchange_weak: 可能出现伪失败,适用于循环重试的情况(如实现自旋锁),性能更高。
参考资料
1 . std::atomic<T>::compare_exchange_weak, std::atomic<T>::compare_exchange_strong的用法

浙公网安备 33010602011771号