内核提供了原子整数类型,称为 atomic_t 。在 32 位的 x86 平台上,被定义在 include/asm-x86/Atomic_32.h 中:
[Plain Text] 纯文本查看 复制代码 typedef struct { int counter; } atomic_t;
Q:为什么不直接定义为单独一个的整型呢?
A: 这么做可以让 GCC 在编译的时候能进行更加严格的类型检查。用结构体将变量保护起来,就没办法直接用普通的运算符进行操作,所以在错误使用的情况下编译会报错。
用来初始化原子变量的有一个宏 ATOMIC_INIT(),定义如下:
[Plain Text] 纯文本查看 复制代码 #define ATOMIC_INIT(i) { (i) }
这个宏就是用来初始化原子变量结构体的,正确的使用方法为:
[Plain Text] 纯文本查看 复制代码 atomic_t count = ATOMIC_INIT(1)
括号中的数值为整数。
但是如果这样做就会出错:
[Plain Text] 纯文本查看 复制代码
atomic_t count;
count = ATOMIC_INIT(1);
对整个结构体类型赋值,不允许在非初始化的时候进行,否则会发出如下报错信息:expected expression before ‘{’ token
所以,从这里也可以看到,为什么要将原子变量类型定义为结构体了。
此外,初始化原子变量还有宏 atomic_set ,它也定义在 include/asm-x86/Atomic_32.h 中:
| | * atomic_set - set atomic variable | * @v: pointer of type atomic_t | * @i: required value | * | * Atomically sets the value of @v to @i. | */ | #define atomic_set(v,i) (((v)->counter) = (i)) |
|
其中 v 是 atomic_t 类型变量指针,i 表示要对原子变量设置值。 |
|