多线程同步锁,原子锁为啥比较快
首先,说一下原子指令:
指令 | 效果 | 描述 |
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 指令是一个 RMW(Read,Modify,Write) 操作,指令执行包括三个阶段:读内存,修改变量,写内存。
系统提供了一个 lock前缀,有lock 前缀 的只能用于 防存指令,在执行期间,内存总线会被锁定,知道 指令 执行结束。
这样的lock_incl 的指令 被称为 原子 操作 。
结论 :
而类似于 windows 下面的 临界区 ,由于需要锁定 执行的 指令 比较多,每次 读取的字节数 也 有可能 大于 计算机字长 ,所以需要多次 lock_incl 操作,所以相比较真正的 原子操作 ,会比较慢。
很多时候,我们的共享数据都大于一个字长,更新操作也不是一条指令就可以完成的。更多时候,我们还需要保证一组共享数据的一系列更新的原
子性。