我正在研究Robert Love的Linux内核开发Linux内核。
如您所知,本书使用旧版本的Linux。它是2.6版本
atomic_t有" volatile int counter"。但是新的Linux版本的atomic_t有" int counter"不易变。为什么这种挥发性已经消失了?
答案 0 :(得分:7)
因为volatile变量不是原子变量。使用volatile
的唯一要点是防止可能的编译器优化,这与防止不需要的并发访问不同。
在这方面,使用volatile
几乎是不正确的。
您可以在Semantics and Behavior of Atomic and Bitmask Operations中了解更多相关信息。
引用其中的一小部分:
*警告:atomic_read()和atomic_set()不要暗示障碍! * 强>
某些架构可能会选择使用volatile关键字,障碍或内联 汇编以保证atomic_read()和。的一定程度的即时性 atomic_set()。这不是一致的保证,将来可能会改变, 所以atomic_t的所有用户都应该将atomic_read()和atomic_set()视为简单 C语句可以完全由编译器重新排序或优化 或处理器,并显式调用适当的编译器和/或内存 每个用例的障碍。如果不这样做,将导致代码可能 与不同的架构或编译器一起使用时突然中断 优化,甚至是无关代码的变化,这些变化如何变化 编译器优化访问atomic_t变量的部分。
*您已被警告过! * 强>