系统相关
首页 > 系统相关> > c – 我是否需要使用内存屏障来保护共享资源?

c – 我是否需要使用内存屏障来保护共享资源?

作者:互联网

在多生产者,多消费者的情况下.如果生产者写入int a,并且消费者正在读取int a,我是否需要围绕int a的内存屏障?

我们都了解到:共享资源应该始终受到保护,标准不能保证正确的行为.

然而,在高速缓存一致的体系结构上,可以自动确保可见性,并且保证8,16,32和64位变量的原子性MOV操作.

因此,为什么要保护int?

解决方法:

至少在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原子地工作,所以你可能必须保护它(如果你试图从多个线程写入,无论如何).

然后由编译器/标准库来确定处理原子性要求的最佳方法.在确保高速缓存一致性的典型体系结构中,它可能仅仅意味着“不要在寄存器中分配此变量”.它可能会造成内存障碍,但只能在真正需要它们的系统上实现.

标签:lock-free,c
来源: https://codeday.me/bug/20190725/1529314.html