Vil*_*ray 5 c linux gcc c99 linux-kernel
我正在在线阅读Linux 设备驱动程序第 3 版书籍,但在理解原子变量的初始化宏时遇到问题:
static atomic_t foobar = ATOMIC_INIT(1);
Run Code Online (Sandbox Code Playgroud)
我查看了Linux kernel v3.2的源代码,但我只提出了两个定义:
#define ATOMIC_INIT(i) { (i) }
Run Code Online (Sandbox Code Playgroud)
和
#define ATOMIC_INIT(i) ((atomic_t) { (i) })
Run Code Online (Sandbox Code Playgroud)
宏定义的第二个版本似乎在功能上与第一个版本相同——事实上,当值无论如何都会隐式转换为 时,即使进行显式转换似乎也是多余的atomic_t。为什么有两个版本的定义?
ATOMIC_INIT如果atomic_tLinux 内核的未来版本中的结构发生变化,宏的目的是否只是为了防止代码中断?
许多原子操作必须为每个体系结构单独实现。中各种宏和函数的目的atomic.h是隐藏体系结构之间的差异。
实际上,所有体系结构都使用单个 32 位变量来实现atomic_t,因此各种宏没有实际差异ATOMIC_INIT;所有有趣的事情都发生在操作中。但内部结构可能会发生变化(对于 32 位 SPARC确实发生过一次变化),因此您始终应该使用官方 API。