【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的用法

posted @ 2021-05-22 23:01  苏格拉底的落泪  阅读(7811)  评论(0)    收藏  举报