linux-kernel - 为什么 arm atomic_[read/write] 操作实现为 volatile 指针?
问题描述
他是 atomic_read 实现的示例:
#define atomic_read(v) (*(volatile int *)&(v)->counter)
另外,我们是否应该明确地使用内存屏障来进行 arm 上的原子操作?
解决方案
是的,转换为 volatile 是为了防止编译器假设 v 的值不能改变。至于使用内存屏障,GCC 内置程序已经允许您指定所需的内存顺序,无需手动执行:https ://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/_005f_005fatomic-Builtins .html#g_t_005f_005fatomic-Builtins
GCC 的默认行为是使用__ATOMIC_SEQ_CST
which 将在 Arm 上发出必要的屏障,以确保您的原子按照您在代码中放置的顺序执行。为了优化 Arm 的性能,您将需要考虑使用较弱的语义来允许编译器消除障碍并让硬件更快地执行。有关 Arm 架构具有的内存屏障类型的更多信息,请参阅https://developer.arm.com/docs/den0024/latest/memory-ordering/barriers。
推荐阅读
- flutter - 错误:找不到类型“ui.Window”。ui.Window 获取窗口 => ui.window;
- python - 为什么来自 LinearRegression 的分数与来自 sklearn.metrics 的 r2_score 给出不同的结果
- npm - Renovate:在一个合并请求中对依赖项进行分组
- php - 标头可能不包含多个标头,检测到新行 [PHP MYSQL]
- javascript - JavaScript | 尝试从 sketchfab 添加动画角色,但未在网站上制作动画
- knative - 在没有互联网的情况下安装 Knative
- python - 点安装 python.binance
- java - PMD gradle 插件无法识别安全规则集
- visual-studio-code - VSC 状态栏上的 Live Server 图标
- python - 如何让我的助手通过某个短语激活