Linux 中的“atomic_t”

问题描述 投票:0回答:1

我正在通过 Robert Love 的 Linux Kernel Development 学习 Linux 内核。

如您所知,本书使用旧版本的 Linux。现在是2.6版本了。

atomic_t
volatile int counter
。但是新的Linux版本的
atomic_t
int counter
而不是
volatile

为什么

volatile
被删除?

c linux kernel system
1个回答
10
投票

因为易失性变量不是原子变量。使用

volatile
的唯一目的是防止可能的编译器优化,这与防止不需要的并发访问不同。

在这方面,使用

volatile
几乎从来都不正确。

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

引用其中一小部分:

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

某些架构可能会选择使用 volatile 关键字、barrier 或 inline 汇编以保证atomic_read()的某种程度的即时性和 原子集()。这没有统一保证,并且将来可能会改变, 因此所有使用atomic_t的用户都应该将atomic_read()和atomic_set()视为简单的 编译器可以完全重新排序或优化掉的 C 语句 或处理器,并显式调用适当的编译器和/或内存 每个用例的障碍。如果不这样做将导致代码可能 与不同架构或编译器一起使用时突然中断 优化,甚至是不相关代码的更改,这会改变 编译器优化了访问atomic_t变量的部分。

* 您已被警告! *

© www.soinside.com 2019 - 2024. All rights reserved.