小编aim*_*mar的帖子

并行编程中的READ_ONCE和WRITE_ONCE

在《Is Parallel Programming Hard, And, If So,What Can You Do About It?》一书中,作者使用了几个宏,我不明白它们实际上是做什么的。

\n
#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))\n\n#define READ_ONCE(x) \\\n({ typeof(x) ___x = ACCESS_ONCE(x); ___x; })\n\n#define WRITE_ONCE(x, val) \\\ndo { ACCESS_ONCE(x) = (val); } while (0)\n
Run Code Online (Sandbox Code Playgroud)\n

我不明白ACCESS_ONCE宏的作用以及为什么它需要对易失性指针类型的对象进行强制转换和取消引用。

\n

__x宏结尾处的用法是什么READ_ONCE

\n

下面还有一些我不理解的宏的用法。

\n
\n

以下列出了允许对给定变量进行某些访问的简单加载和存储,而对同一变量的其他访问则需要标记(例如 READ_ONCE() 和 WRITE_ONCE())的情况:

\n
    \n
  1. 共享变量只能由给定的所属 CPU 或线程修改,但可以由其他 CPU 或线程读取。所有存储都必须使用 WRITE_ONCE()。所属的 CPU\nor 线程可以使用普通负载。其他一切都必须使用 READ_ONCE() 进行加载。
  2. \n
  3. 共享变量仅在持有给定锁时才会被修改,但会被不持有该锁的代码读取。所有存储都必须使用 WRITE_ONCE()。持有锁的 CPU 或线程可能会使用普通负载。其他一切都必须使用 READ_ONCE() 进行加载。
  4. \n
  5. 共享变量仅在给定拥有的 CPU 或线程持有给定锁时才会被修改,但会被其他 CPU 或线程或不持有该锁的代码读取。所有存储都必须使用 WRITE_ONCE()。拥有该锁的 CPU …

c multithreading atomic volatile linux-kernel

6
推荐指数
1
解决办法
1595
查看次数

标签 统计

atomic ×1

c ×1

linux-kernel ×1

multithreading ×1

volatile ×1