c# 易失性与内存屏障

xjreopfe  于 2023-03-16  发布在  C#
关注(0)|答案(1)|浏览(228)

有没有可能用内存屏障来实现与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
}
o0lyfsai

o0lyfsai1#

volatile将确保编译器不会重新排序或跳过内存访问。
内存屏障确保你的系统(硬件-处理器、内存系统、总线等)不会重新排序写入或读取。
这是完全不同的东西,一些编译器(如Microsoft的编译器)在访问volatile对象时添加了内存屏障(ARM和其他弱内存排序架构除外-但您可以通过使用编译器标志强制执行此行为)

相关问题