曲径通幽论坛

标题: 原子变量 | atomic_t | ATOMIC_INIT(i) |atomic_set() [打印本页]

作者: beyes    时间: 2011-2-24 16:42
标题: 原子变量 | atomic_t | ATOMIC_INIT(i) |atomic_set()
内核提供了原子整数类型,称为 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 表示要对原子变量设置值。






欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2