原子操作为啥比较快

多线程同步锁,原子锁为啥比较快




首先,说一下原子指令:


指令

效果

描述

leal S,D

D = &S

movl地版,S地址入D,D仅能是寄存器

incl D

D++

加1

decl D

D--

减1

negl D

D = -D

取负

notl D

D = ~D

取反

addl S,D

D = D + S

subl S,D

D = D – S

imull S,D

D = D*S

xorl S,D

D = D ^ S

异或

orl S,D

D = D | S

andl S,D

D = D & S

sall k,D

D = D << k

左移

shll k,D

D = D << k

左移(同sall)

sarl k,D

D = D >> k

算数右移

shrl k,D

D = D >> k

逻辑右移



里面的 ++  和 -- 指令  分别是  incl  和 decl 指令


计算机字长 : 字长是CPU的主要技术指标之一,指的是CPU一次能并行处理的二进制位数,字长总是8的整数倍,通常PC机的字长为16位(早期),32位,64位

所以一般 等于 或者 小于 计算机字长的 指令操作,就是原子操作 。

incl 指令是一个 RMWReadModifyWrite) 操作,指令执行包括三个阶段:读内存,修改变量,写内存。


系统提供了一个 lock前缀,有lock 前缀 的只能用于 防存指令,在执行期间,内存总线会被锁定,知道 指令 执行结束。

这样的lock_incl 的指令 被称为 原子 操作 。

结论 :


而类似于 windows 下面的 临界区 ,由于需要锁定 执行的 指令 比较多,每次 读取的字节数 也 有可能 大于  计算机字长 ,所以需要多次 lock_incl 操作,所以相比较真正的 原子操作 ,会比较慢。

很多时候,我们的共享数据都大于一个字长,更新操作也不是一条指令就可以完成的。更多时候,我们还需要保证一组共享数据的一系列更新的原
子性。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值