Tag: 并行处理无

互锁和记忆障碍

我有一个关于以下代码示例的问题( m_value不是volatile,每个线程都在一个单独的处理器上运行) void Foo() // executed by thread #1, BEFORE Bar() is executed { Interlocked.Exchange(ref m_value, 1); } bool Bar() // executed by thread #2, AFTER Foo() is executed { return m_value == 1; } 在Foo()中使用Interlocked.Exchange是否保证在执行Bar()时,我会看到值“1”? (即使该值已经存在于寄存器或缓存行中?)或者在读取m_value的值之前是否需要设置内存屏障? 另外(与原始问题无关),声明一个volatile成员并通过引用InterlockedXX方法传递它是合法的吗? (编译器警告通过引用传递volatile,所以在这种情况下我应该忽略警告吗?) 请注意 ,我不是在寻找“更好的做事方式”,所以请不要发布建议完全替代方式(“使用锁定”等)的答案,这个问题来自于纯粹的兴趣..