线程同步:如何保证写操作的可见性 [英] Thread synchronization: How to guarantee visibility of writes

查看:14
本文介绍了线程同步:如何保证写操作的可见性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

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

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

但我能确保完全可以看到写入吗?在内存模型下,只要标志的写入时间不早于值,无限期延迟写入是否合法?

在数据库方面,能否使用内存模型来推断持久性(除了原子性和一致性,这可以通过使用内存栅栏和标志来保证,如上例所示)?

更新: Detailed semantics of volatile regarding timeliness of visibility在Java内存模型的上下文中解决了相同的主题,Memory model ordering and visibility?在C++11中。这一讨论是否也适用于硬件内存模型,即CPU ISA是否只为正确的可见性序列提供硬保证,而为延迟的可见性提供"软"保证?

推荐答案

很难证明是否定的--有很多指令集体系结构。然而,我怀疑您是对的,没有任何硬件内存模型能够保证写入的最终可见性。

我强烈推荐阅读A Formal Specification of Intel® Itanium® Processor Family Memory Ordering,因为尽管您可能不关心Itanium,但它是对硬件内存模型通常关心的保证的极好且可读的描述。

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

这篇关于线程同步:如何保证写操作的可见性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆