线程共享变量是直接访问的吗?

Are thread shared variables directly accessed?

阅读有关 C++ 内存模型和排序指令的文章向我提出了一个问题 - 在同一个进程中,当线程共享原子变量(例如原子变量)设置在一个线程中时 - 并且加载顺序在store - 负载是否可能没有看到存储的值?

重新措辞 - 订购的是保证按原样加载一组原子值,还是有一个 CPU/cache/etc 抽象仍然可以提供旧值?

问题的原因是一些文献讨论了同步(除了排序)并且他们使用的语言是 "as seen by another thread" - 这让我想知道加载是否不是对内存位置的直接访问(它除了订购之外不需要任何其他同步)。

我不确定我是否正确理解了你的问题,但我可以尝试提供一些关于 C++ 内存模型的细节。

C++ 原子的所有操作的默认内存顺序是顺序一致。形式上,这意味着所有顺序一致的操作(无论由哪个线程执行)都有一个总顺序(S)。因此,如果线程 A 对某个变量 X 执行 seq-cst-store,并且线程 BX上执行一次seq-cst-load,store在S中加载之前被排序,那么保证B 看到 A 存储的值(或一些更新的值)。

但是,一旦您对操作使用更宽松的内存排序,您就失去了这种保证,因为这些更宽松的原子操作通常是 无序的 。但是,您可以通过某些操作之间的 happens-before 关系 引入顺序。例如,看到发布存储写入的值的获取加载 与存储同步 ,从而建立先行发生关系。

C++ 内存模型无疑是语言中较为复杂的方面之一,无法用简单的答案来彻底解释。有关更多详细信息,我建议进一步阅读我合着的这篇论文:Memory Models for C/C++ Programmers
它不仅涵盖了C++内存模型,还对x86和ARM/Power的内存模型进行了简要概述,试图解释为什么需要内存模型第一。