简单理解多线程原子指令与CAS

文章讨论了汇编指令如adddwordptr[i],1的非原子性,强调了像moveax,ecx这样的操作是原子的。文中提到使用atomic变量、CAS函数和lock指令前缀来实现伪原子操作,以及mutex锁如何利用原子操作检测线程占用。
摘要由CSDN通过智能技术生成


多线程一条汇编指令是原子指令吗?不一定,比如add dword ptr[i],1不是,因为可以拆分成多个步骤,先把i的值从内存读到寄存器,寄存器经过运算器加1最后才把寄存器的值写会。而mov eax,ecx就是,区别是对内存操作一次以上就不是,操作0或1次就是,通过atomic原子变量,对该变量读或修改时,很大可能生成原子指令(伪原子),本质是加上指令前缀lock,对内存总线锁住。如果针对比较后等于原先预定值,才能对其修改,比如原先饼干是有5包的,但读取出来是4包证明被人偷了,这种情况下则不吃那么快去找人算账,即自身不修改为3,退出执行。C语言提供cas函数(全程compare and swap),把几条操作都锁定下来。如果只用atomic则多条指令单个是原子的,但几个加起来就不是原子的。
mutex互斥锁在判断锁变量是否被其他线程占用时也用到了原子锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值