易失性与内存屏障

问题描述 投票:0回答:1

是否有可能通过内存屏障实现 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
}
c multithreading gcc memory-barriers
1个回答
0
投票

volatile
将确保编译器不会重新排序或跳过内存访问。

内存屏障确保您的系统(硬件——处理器、内存系统、总线等)不会重新排序写入或读取。

这是完全不同的东西,一些编译器(如 Microsoft 编译器)在访问

volatile
对象时添加内存屏障(ARM 和其他弱内存排序架构除外 - 但您可以通过使用编译器标志来强制执行此行为)

© www.soinside.com 2019 - 2024. All rights reserved.