【发布时间】:2012-10-12 03:26:44
【问题描述】:
已经有很多关于软件和硬件内存模型、内存栅栏、存储/加载重新排序等的信息。然而,这一切似乎都集中在保证读写共享内存的相对顺序上。
这样的系统将线程的写入完全延迟很长时间是否合法?
例如,考虑一个线程对内存中的数据结构进行一些更新,然后引发一个应该通知其他线程更新的标志:
(dataWritten is initially false)
store value1
store value2
store value3
mfence
store dataWritten (true)
根据我读过的大多数内存模型,内存屏障保证任何其他线程都无法将 dataWritten 视为 true,同时仍读取过时的值 1、2 或 3,即它使这些写入原子化。
但是我可以确定这些写入会被看到吗?只要标志的写入时间不早于值,在内存模型下无限期延迟写入是否合法?
在数据库方面,内存模型是否可以用于推理持久性(除了原子性和一致性,这可以通过使用上面示例中的内存围栏和标志来保证)?
更新: Detailed semantics of volatile regarding timeliness of visibility 在 Java 内存模型的上下文中解决了相同的主题,Memory model ordering and visibility? 用于 C++11。该讨论是否也适用于硬件内存模型,即 CPU ISA 是否只为正确的可见性序列提供硬保证,而为延迟可见性提供“软”保证?
【问题讨论】:
-
即它使这些写入原子。 - 原子性与排序分开;这意味着缺乏撕裂;您要么看到存储的值,要么看到以前的值,而不是每个值的一些字节。障碍不能创造原子性。顺便说一句,
mfence是一条 x86 指令,但 x86 内存模型已经保证了存储顺序。 (具体来说,x86 内存排序是程序顺序加上带有存储转发的存储缓冲区。)
标签: synchronization thread-safety cpu-architecture memory-barriers memory-model