线程同步:如何保证写入的可见性

时间:2012-10-22 10:24:32

标签: synchronization thread-safety memory-model memory-barriers

已经有很多关于软件和硬件内存模型,内存屏障,存储/加载重新排序等的信息。但是,这一切似乎都集中在保证读取和写入共享内存的相对顺序。

这样一个系统在很长一段时间内完全延迟线程的写入是不合法的呢?

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

(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内存模型的上下文中解决了相同的主题,在{+ 3}}中解决了C ++ 11的问题。这种讨论是否也适用于硬件内存模型,即CPU ISA仅为正确的可见性序列提供了硬性保证,但是“软”保证了延迟可见性吗?

1 个答案:

答案 0 :(得分:3)

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

我强烈建议您阅读A Formal Specification of Intel® Itanium® Processor Family Memory Ordering,因为尽管您可能并不关心Itanium,但它仍然是对硬件内存模型通常所关注的内容的一种出色且可读的描述。

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