2

已经有很多关于软件和硬件内存模型、内存栅栏、存储/加载重新排序等的信息。然而,这一切似乎都集中在保证读写共享内存的相对顺序上。

这样的系统将线程的写入完全延迟很长时间是否是合法行为?

例如,考虑一个线程对内存中的数据结构进行一些更新,然后引发一个应该通知其他线程更新的标志:

(dataWritten is initially false)
store value1
store value2
store value3
mfence
store dataWritten (true)

根据我读过的大多数内存模型,内存屏障保证任何其他线程都无法将 dataWritten 视为 true,同时仍读取过时的值 1、2 或 3,即它使这些写入原子。

但是我能确定这些写的东西会被看到?只要标志的写入时间不早于值,在内存模型下无限期延迟写入是否合法?

用数据库术语来说,内存模型可以用来推理持久性(除了原子性和一致性,这可以通过使用上面示例中的内存围栏和标志来保证)?

更新: 关于可见性及时性的 volatile 详细语义解决了 Java 内存模型上下文中的同一主题,以及内存模型排序和可见性?对于 C++11。该讨论是否也适用于硬件内存模型,即 CPU ISA 是否只为正确的可见性序列提供硬保证,但为延迟可见性提供“软”保证?

4

1 回答 1

4

很难证明是否定的——那里有很多指令集架构。但是,我怀疑您是对的,没有硬件内存模型可以保证写入的最终可见性。

我强烈推荐阅读英特尔® 安腾® 处理器家族内存订购的正式规范,因为尽管您可能并不关心安腾,但它是对硬件内存模型通常关心的保证内容的出色且易读的描述。

实际上,只要 CPU 仍在执行指令,它最终将不得不刷新其写入。此外,只要写入命中 L2 缓存或附近,由于缓存一致性协议,它通常应该对其他 CPU 可见。所以我认为这不是特别需要担心的事情。

于 2012-11-03T05:45:28.220 回答