有没有可能用内存屏障来实现与volatile变量相同的“保证”(总是读/写内存而不是寄存器)?2只是在一个线程中写入变量,而在另一个线程中阅读它的值。3下面的语句是否等价?
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
}
1条答案
按热度按时间o0lyfsai1#
volatile
将确保编译器不会重新排序或跳过内存访问。内存屏障确保你的系统(硬件-处理器、内存系统、总线等)不会重新排序写入或读取。
这是完全不同的东西,一些编译器(如Microsoft的编译器)在访问
volatile
对象时添加了内存屏障(ARM和其他弱内存排序架构除外-但您可以通过使用编译器标志强制执行此行为)