在多生产者、多消费者的情况下。如果生产者正在写入 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/

10-12 17:18