头文件:<atomic>

函数声明:

bool compare_exchange_weak( T& expected, T desired,

                            std::memory_order success,

                            std::memory_order failure ) noexcept;

原子地比较 *this 和 expected 的值,而若它们逐位相等,则以 desired 替换前者(进行读修改写操作)。

否则,将 *this 中的实际值加载进 expected (进行加载操作)。读修改写和加载操作的内存模型分别为 success 和 failure

 

expected:若比较失败则被存储 *this 的实际值。
desired:若逐位相等,则将desired的值存储于原子对象
success:若比较成功,则读-修改-写操作所用的内存同步顺序。。
failure:若比较失败,则加载操作所用的内存同步顺序。不能为 std::memory_order_release 或 std::memory_order_acq_rel ,且不能指定强于 success 的顺序 (C++17 前)
order:两个操作所用的内存同步顺序

bool compare_exchange_weak( T& expected, T desired,

                            std::memory_order success,

                            std::memory_order failure ) volatile noexcept;
bool compare_exchange_weak( T& expected, T desired,

                            std::memory_order order =

                                std::memory_order_seq_cst ) noexcept;

bool compare_exchange_weak( T& expected, T desired,

                              std::memory_order order =

std::memory_order_seq_cst ) volatile noexcept;

bool compare_exchange_strong( T& expected, T desired,

                              std::memory_order success,

                              std::memory_order failure ) noexcept;
bool compare_exchange_strong( T& expected, T desired,

                              std::memory_order success,

                              std::memory_order failure ) volatile noexcept;
bool compare_exchange_strong( T& expected, T desired,

                              std::memory_order order =

                                  std::memory_order_seq_cst) noexcept;
bool compare_exchange_strong( T& expected, T desired,

                              std::memory_order order =

                                  std::memory_order_seq_cst ) volatile noexcept;

 

 

#include <atomic>
#include <iostream>

std::atomic<int>  ai;

int  tst_val= 4;
int  new_val= 5;
bool exchanged= false;

void valsout()
{
    std::cout << "ai= " << ai
              << "  tst_val= " << tst_val
              << "  new_val= " << new_val
              << "  exchanged= " << std::boolalpha << exchanged
              << "\n";
}

int main()
{
    ai= 3;
    valsout();

    // tst_val != ai   ==>  tst_val 被修改为 ai的值,返回值为false
    exchanged= ai.compare_exchange_strong( tst_val, new_val );  
    valsout();

    // tst_val == ai   ==>  ai 被修改为 new_val的值,返回值为true
    exchanged= ai.compare_exchange_strong( tst_val, new_val );
    valsout();
}

运行结果:

 

 

 

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐