Linux中的atomic_t

A.C*_*Cho 8 c linux kernel system

我正在研究Robert Love的Linux内核开发Linux内核.

如您所知,本书使用旧版Linux.它是2.6版本

atomic_t有"volatile int counter".但是新Linux版本的atomic_t的"int counter"并不易变.为什么这种挥发性已经消失了?

jwe*_*ich 7

因为volatile变量不是原子变量.使用的唯一方法volatile是防止可能的编译器优化,这与防止不必要的并发访问不同.

在这方面,使用volatile几乎永远不正确.

您可以在原子和位掩码操作的语义和行为中阅读更多相关信息.

引用其中的一小部分:

*警告:atomic_read()和atomic_set()不要暗示障碍!*

某些体系结构可能会选择使用volatile关键字,障碍或内联汇编来保证atomic_read()和atomic_set()的某种程度的即时性.这不是一致的保证,并且可能在将来发生变化,因此atomic_t的所有用户都应将atomic_read()和atomic_set()视为可以完全由编译器或处理器重新排序或优化的简单C语句,并显式调用相应的每个用例的编译器和/或内存屏障.如果不这样做,将导致代码在与不同的体系结构或编译器优化一起使用时可能突然中断,甚至会导致无关代码的更改,从而改变编译器优化访问atomic_t变量的部分的方式.

*你被警告了!*

  • 根据我指出的文档,他们将变量包装在结构中并将其定义为类型的原因是为了防止任何类型的转换为普通的 C 整数类型。 (2认同)