繁体   English   中英

为什么内存屏障取决于变量?

[英]Why do memory barriers depend upon a variable?

在对内存屏障/围栏的总体目的进行了一些研究之后,(至少我认为)我对它们的用途有了基本的了解。 在我的研究中,我专注于 C++ 的抽象,因为障碍似乎是特定于硬件的,而 C++ 是一种低级但普遍可用的语言。 然而,标准库对内存屏障抽象的语义中有一个细节让我怀疑我对它们的理解。

关于 C++ 内存屏障memory_order_acq_rel文档说明(类似的行为也适用于其他屏障):

释放相同原子变量的其他线程中的所有写入在修改之前都是可见的,并且修改在获取相同原子变量的其他线程中是可见的。

在处理器级别(因为如果没有相应的硬件限制,这个限制就不会存在):如果所有以前的更改都受到影响,为什么特定变量的规范很重要? 例如,无论哪种方式都必须刷新缓存,不是吗? 这种方法的主要优点是什么?

先感谢您。

使用原子变量作为控制内存屏障的方法只是 C++ 为您提供这种控制的一种方式。 (可能是最常用的方式,我可能会补充。)

不过,您不需要使用它们。

您可以调用std::atomic_thread_fencestd::atomic_signal_fence 等函数,它们实现了内存屏障语义,而无需任何关联变量。

通常,您应该遵循 C++20 内存模型。 Invidia 开发人员在前一个模型中发现了一个错误(编写了一个完全合法的 C++ 代码,该代码遵循标准规则,但导致 UB - 数据竞争 - 内存模型中的适当问题),我听说还有一些其他问题。 此外,C++ 力求成为一种可以在各种设备上运行的通用语言,因此某些规则对于某些设备可能毫无意义,而对于其他设备则极为重要。

我不确定实现细节以及处理器实际需要做什么。 但是,除了处理器对原子变量的操作之外,它还通知编译器有关允许和禁止的优化。 例如,逻辑上不可从其他线程访问的局部变量永远不需要重新加载到缓存中,而不管对原子变量执行的操作如何。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM