Atomic原子变量详解
原子变量
适用于针对int变量进行同步的场景
Atomic使用
1 | atomic_t ac = ATOMIC_INIT(1); |
Atomic实现
atomic_t定义
定义在include/linux/types.h中
1 | typedef struct { |
初始化
不同体系下实现不同,x86实现如下:
1 |
|
嵌入式汇编代码语法
1 | asm("汇编语言" |
汇编代码:x86或者arm的汇编代码指令
输出寄存器:表示汇编代码执行完成后,哪些寄存器用于存放输出数据。这些寄存器会分别对应一个C语言表达式或者一个内存地址
输入寄存器:表示开始执行汇编代码时,这里指定的一些寄存器用于存放输入值,也分别对应一个C变量或常数值
会被修改的寄存器:也叫clober list,描述了汇编代码对寄存器的修改情况
- asm是关键字,必选项
- volatile 是可选的,加了,GCC 就不会优化这句。
- 汇编指令间必须被双引号括起来;
- 汇编指令间必须使用”;”、”/n”或”/n/t”分开分开;
- ()内的是可选的,如asm volatile(“”)是可以的,只是无意义
- 仅省动其中一项,分号需要加上: 如这个省了输入和输出的,asm volatile (“sync” : : :”memory”)
- Clobber/Modify表示特定的关键字,让汇编做相应的动作
输入和输出及最后的前缀说明:
“=”: 表示只写,常用于输出参数。
“+”: 表示可读可写
“m”、”v”和”o”:内存操作单元,V:寻址方式不是偏移量类型; o:寻址方式是偏移量类型
“r”: 寄存器单元
“i”和”h” :常数
“E”和”F”:浮点数
“a”: 输入变量放入eax
“p”: 合法的内存指针
“memory”: 表示通知有内存变动
“&”: 该输出操作数不能使用和输入操作数相同的寄存器
“X”: 表示任何类型
“*: 表示如果选用寄存器,则其后的字母被忽略
#部分行注释,从该字符到其后的逗号之间所有字母被忽略
占位符引用C语言变量,操作数占位符最多10 个,名称如下:%0,%1,…,%9。指令中使用占位符表示的操作数,总被视为long型(4个字节),在%和序号之间插入一个字母,”b”代表低字节,”h”代表高字节。0% 表示第一个参数, 1%这种数字表示第二个参数,依次类推
atomic_inc实现
include/linux/atomic/atomic-instrumented.h:
1 | static __always_inline void |
采用汇编实现,x86实现如下:
1 | /** |
atomic_dec实现
1 | static __always_inline void |
x86实现如下:
1 | /** |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ansore!



