【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;

用法: 原子的比较 *this  和 expect的值,若它们逐位相等,则以 desired 替换前者(进行读修改写操作)。否则,将 *this 中的实际值加载进 expected (进行加载操作)。

#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 is modified
    exchanged= ai.compare_exchange_strong( tst_val, new_val );
    valsout();

    // tst_val == ai   ==>  ai is modified
    exchanged= ai.compare_exchange_strong( tst_val, new_val );
    valsout();
}

 

分析

1. 当ai = 3时,ai不等于 tst_val, 将tst_val 的值设为3,返回false。

2. 当ai= 3时,ai 等于tst_val, 将tst_val 的值设为new_val, 即将5赋值给ai,返回true。

参考资料

1 . std::atomic<T>::compare_exchange_weak, std::atomic<T>::compare_exchange_strong的用法

posted @   苏格拉底的落泪  阅读(7077)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2018-05-22 二叉树的基本理论知识
2018-05-22 【C++】类前置声明范例
点击右上角即可分享
微信分享提示