已经有很多关于软件和硬件内存模型、内存栅栏、存储/加载重新排序等的信息。然而,这一切似乎都集中在保证读写共享内存的相对顺序上。
这样的系统将线程的写入完全延迟很长时间是否是合法行为?
例如,考虑一个线程对内存中的数据结构进行一些更新,然后引发一个应该通知其他线程更新的标志:
(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 是否只为正确的可见性序列提供硬保证,但为延迟可见性提供“软”保证?