在多生产者、多消费者的情况下。如果生产者正在写入 int a
,而消费者正在读取 int a
,我是否需要围绕 int a
的内存屏障?
我们都知道: 共享资源应该始终受到保护,否则标准并不能保证正确的行为。
然而,在缓存一致性架构上,自动确保可见性,并保证 8、16、32 和 64 位变量 MOV
操作的原子性。
因此,为什么要保护 int a
呢?
最佳答案
至少在 C++11(或更高版本)中,您不需要(明确地)使用互斥锁或内存屏障保护您的变量。
您可以使用 std::atomic
创建一个原子变量。对该变量的更改保证可以跨线程传播。
std::atomic<int> a;
// thread 1:
a = 1;
// thread 2 (later):
std::cout << a; // shows `a` has the value 1.
当然,还有更多的东西——例如,不能保证
std::cout
原子地工作,所以你可能必须保护它(如果你尝试从多个线程写入,无论如何)。然后由编译器/标准库来找出处理原子性要求的最佳方法。在确保缓存一致性的典型架构上,它可能仅意味着“不要在寄存器中分配此变量”。它可能会施加内存障碍,但只有在真正需要它们的系统上才有可能这样做。
关于c++ - 我是否需要使用内存屏障来保护共享资源?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27008574/