是否有可能通过内存屏障实现 volatile 变量的相同“保证”(始终读/写内存而不是寄存器)? 只需在一个线程中写入一个变量,然后在另一个线程中读取它的值。下面是等价的吗?
#define rmb() __sync_synchronize()
#define wmb() __sync_synchronize()
static volatile int a;
static int b;
static void *thread1(void *arg)
{
...
a = 1;
...
b = 1;
wmb();
}
static void *thread2(void *arg)
{
...
while (a != 1)
;
// do something
...
rmb();
while (b != 1)
;
// do something
}
volatile
将确保编译器不会重新排序或跳过内存访问。
内存屏障确保您的系统(硬件——处理器、内存系统、总线等)不会重新排序写入或读取。
这是完全不同的东西,一些编译器(如 Microsoft 编译器)在访问
volatile
对象时添加内存屏障(ARM 和其他弱内存排序架构除外 - 但您可以通过使用编译器标志来强制执行此行为)