ACCESS_ONCE()/WRITE_ONCE()/READ_ONCE()

💡 原文中文,约2400字,阅读约需6分钟。
📝

内容提要

ACCESS_ONCE() 是 Linux 源码中的宏,确保编译器不会合并或重新获取对标量类型的访问。它通过将变量转为 volatile 类型,防止编译器优化引发错误。READ_ONCE() 和 WRITE_ONCE() 适用于非标量类型,主要用于进程与中断处理之间的通信,确保内存访问顺序性。

🎯

关键要点

  • ACCESS_ONCE() 是 Linux 源码中的宏,用于确保编译器不会合并或重新获取对标量类型的访问。
  • ACCESS_ONCE() 通过将变量转为 volatile 类型,防止编译器优化引发错误。
  • ACCESS_ONCE() 只能用于标量类型,如 char, short, int, long 及其可转换类型。
  • READ_ONCE() 和 WRITE_ONCE() 适用于非标量类型,主要用于进程与中断处理之间的通信。
  • ACCESS_ONCE() 的作用是防止编译器合并或重新获取访问,并确保内存访问顺序性。
  • ACCESS_ONCE() 的使用场景包括进程级代码与 irq/NMI 处理程序之间的通信。
  • ACCESS_ONCE() 也可以用于确保编译器不对不需要排序的访问进行优化。
  • 建议在可能的情况下使用 READ_ONCE()/WRITE_ONCE() 替代 ACCESS_ONCE()。
➡️

继续阅读