C++ 中的 CAS 操作用于操作原子变量,它是 atomic<T> 的成员函数。

#include <atomic>template <class T>
struct atomic;
bool compare_exchange_weak(T& expected, T val,memory_order sync = memory_order_seq_cst) volatile noexcept;

将当前原子变量的内容与 expected 相比较,

  • 如果两者相等,则更新当前原子变量的内容为 val,并返回 true
  • 如果不相等,则将 expected 更新为当前原子变量的内容,并返回 false

需要注意的是:在进行判等操作时,它执行的是物理上的比较,即直接比较内存值,而不是使用 T== 操作符进行比较。

此外,它允许虚假失败,也就是当前原子变量的内容与 expected 相等,但是它仍然返回 false ,但它不会修改 expected

它需要放在循环中使用。

如,

struct Node { int value; Node* next; };
std::atomic<Node*> list_head(nullptr);// 插入节点到表头
void insert(int val) {Node* oldHead = list_head;Node* newNode = new Node{ val,oldHead };while (!list_head.compare_exchange_weak(oldHead, newNode)) {newNode->next = oldHead;}
}
bool compare_exchange_strong(T& expected, T val,memory_order sync = memory_order_seq_cst) volatile noexcept;

compare_exchange_weak() 大致相似,只是它不允许发生虚假失败。

C++ CAS 操作相关推荐

  1. Handle table中CAS操作与A-B-A Problem解析

    在研究handle table的时候顺便研究的东西.Baidu了下,发现国内这方面的资料几乎没得,然后就准备瞎bb下,为下面的一篇介绍handle table的结构做准备. 关于lock-free d ...

  2. CAS操作与无锁队列

    在多线程编程中,为了保证内存的可见性,我们加入了一些锁的机制,例如信号量,互斥锁,条件变量等等,但是锁的机制不是一个简单的机制,需要加入很多的控制,所以在使用中又有了一些轻量级的同步机制,例如vola ...

  3. java disruptor压测_Java并发框架Disruptor实现原理与源码分析(二) 缓存行填充与CAS操作...

    ##缓存行填充 关于缓存行填充在我个人的印象里面第一次看到是在Java的java.util.concurrent包中,因为当时很好奇其用法背后的逻辑,所以查了很多资料才明白到底是怎么回事*(也许事实上 ...

  4. JAVA并发编程学习笔记之CAS操作

    http://blog.csdn.net/aesop_wubo/article/details/7537960 CAS操作 CAS是单词compare and set的缩写,意思是指在set之前先比较 ...

  5. 对 cas 操作的理解

    cas官方说明: Compare and Swap,比较并操作,CPU指令,在大多数处理器架构,包括IA32.Space中采用的都是CAS指令,CAS的语义是"我认为V的值应该为A,如果是, ...

  6. 基于 Redis 实现 CAS 操作

    基于 Redis 实现 CAS 操作 Intro 在 .NET 里并发情况下我们可以使用 Interlocked.CompareExchange 来实现 CAS (Compare And Swap) ...

  7. java unsafe 详解_Java CAS操作与Unsafe类详解

    一.复习 计算机内存模型,synchronized和volatile关键字简介 二.两者对比 sychronized和volatile都解决了内存可见性问题 不同点: (1)前者是独占锁,并且存在者上 ...

  8. .net 延时操作_锁、CAS操作和无锁队列的实现

    (给算法爱好者加星标,修炼编程内功) 来源:yishizuofei blog.csdn.net/yishizuofei/article/details/78353722 锁的机制 锁和人很像,有的人乐 ...

  9. CAS操作实际上包含了哪两个步骤?

    目录 先讲原理: 再深入CAS规则: 问题:第一步是否应该是修改预期值? 总结一下: 先讲原理: CAS的全称是Compare And Swap(比较并交换),是一种原子操作,通常用于多线程编程中的并 ...

  10. 关于AQS中enq( )方法CAS操作的疑惑

    private Node enq(final Node node) {for (;;) {Node t = tail;//如果队列为空则新建头结点if (t == null) { // Must in ...

最新文章

  1. 前缀、中缀、后缀表达式(转载)
  2. hibernate继承关系映射方法(一)--共享一张表
  3. pythonurllib微博登陆是什么_而不是使用urllib登录网站http.clien
  4. OP07高级电路图-摘自:Reza Moghim
  5. 324. Wiggle Sort II | 324. 摆动排序 II(降序穿插)
  6. Struts文件上传与下载详解 _上传多个文件
  7. 给大家提炼几个产品经理的核心点
  8. php 消息队列_消息队列篇——windows本地搭建RabbitMQ Server
  9. textarea中插入标签_HTMLCSS学习笔记(二)-- HTML表单标签
  10. 中国风喜庆传统新年元旦海报PSD分层模板
  11. 程序员拒带电脑回家被开除获赔 19.4 万;库克称,很多功能来自中国消费者反馈;谷歌开源1.6万亿参数语言模型 | 极客头条...
  12. HALCON:Variation Model用法解析
  13. 基于linux桌面3d面打印机,基于DLP技术的桌面级3D打印机研发
  14. 解决“鼠标关机后仍然发光”的方法
  15. python图像边缘检测_python 简单图像处理(11) 空间域图像锐化(边缘检测)
  16. 【正一专栏】读《夜谭十记》——爱不释手
  17. 组态王五层电梯c语言编程,PLC编程实例分享,多图详解五层楼电梯控制系统~...
  18. 酷软正在连接服务器,蜗牛星际:我的B款双网口机箱PVE+爱快+LEDE 双软路由 保姆级教程...
  19. wordpress后台打开速度非常慢怎么办
  20. 值得品读的感悟人生的经典句子 - 格言网(转载)

热门文章

  1. 2012 A 数学建模
  2. 管理类联考笔试还是计算机考,干货来了!管理类联考笔试考什么?大纲及卷面解读。...
  3. Python使用smtplib、zmail、yagmail发送邮件
  4. 100、网页端的人脸识别
  5. Dlog 替代 NSLog
  6. 一次性计划任务(计划任务)
  7. iptables防火墙与SNAT和DNAT
  8. bzoj3391[Usaco2004 Dec]Tree Cutting网络破坏*
  9. 新垣结衣的孩子长啥样?用 StyleGAN 开源项目,一次看个够
  10. 写一个KEGG富集分析的R语言代码