已经有很多关于软件和硬件内存模型、内存栅栏、存储/加载重新排序等的信息。然而,所有这些似乎都集中在保证共享内存读写的相对顺序上。
对于这样的系统来说,将线程的写入完全延迟很长时间是否合法?
例如,考虑一个线程对内存中的数据结构进行一些更新,然后引发一个应该通知其他线程更新的标志:
(dataWritten is initially false)
store value1
store value2
store value3
mfence
store dataWritten (true)
根据我读过的大多数内存模型,内存屏障保证任何其他线程无法将 dataWritten 观察为 true,同时仍然读取过时的值 1、2 或 3,即它使这些写入成为原子的。
但我能确定写入的内容会被看到吗at all?在内存模型下,只要标志不早于值写入,无限期地延迟写入是否合法?
在数据库术语中,内存模型是否可以用于推断持久性(除了原子性和一致性之外,可以通过使用内存栅栏和标志来保证,如上例所示)?
Update:
易失性关于可见性及时性的详细语义 https://stackoverflow.com/questions/11761552/guarantees-given-by-the-java-memory-model在 Java 内存模型的上下文中解决相同的主题,并且内存模型排序和可见性? https://stackoverflow.com/questions/7461484/memory-model-ordering-and-visibility对于 C++11。该讨论是否也适用于硬件内存模型,即 CPU ISA 是否只为正确的可见性序列提供硬保证,但为延迟可见性提供“软”保证?
很难证明是否定的——有很多指令集架构。但是,我怀疑您是对的,没有硬件内存模型可以保证写入的最终可见性。
我强烈推荐阅读英特尔® 安腾® 处理器家族内存订购的正式规范 http://www.intel.com/design/itanium/downloads/251429.htm,因为尽管您可能不关心 Itanium,但它是对硬件内存模型通常关心的保证的优秀且可读的描述。
实际上,只要 CPU 仍在执行指令,它最终就必须刷新其写入。此外,只要写入已命中 L2 高速缓存或附近,由于高速缓存一致性协议,它通常应该对其他 CPU 可见。所以我认为这并不是特别值得担心的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)