曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 9495|回复: 0
打印 上一主题 下一主题

原子变量 | atomic_t | ATOMIC_INIT(i) |atomic_set()

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2011-2-24 16:42:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
内核提供了原子整数类型,称为 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 表示要对原子变量设置值。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 03:03 , Processed in 0.086100 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表