首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程同步:如何保证写入的可见性

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

Stack Overflow用户
提问于 2012-10-22 10:24:32
回答 1查看 245关注 0票数 2

在软、硬件内存模型、内存栅栏、存储/负载重排序等方面已经有了大量的信息,但似乎都集中在保证共享内存读写的相对有序性上。

这样一个系统是否会将线程的写入延迟很长时间,这是合法的行为吗?

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

代码语言:javascript
复制
(dataWritten is initially false)
store value1
store value2
store value3
mfence
store dataWritten (true)

根据我所读过的大多数内存模型,内存屏障保证任何其他线程都不能将dataWritten视为真,而仍然读取陈旧的值1、2或3,即使这些写入具有原子性。

但我能确定这些文字会被看到吗?在内存模型下,只要标记写得不早于值,无限期延迟写入是否合法?

就数据库而言,内存模型是否可以用来推理持久性(除了原子性和一致性外,还可以通过使用内存围栏和标志来保证,如上面的例子所示)?

更新: 易失性的详细语义与可见性的及时性在Java模型和内存模型排序和可见性? for C++11的上下文中处理了相同的主题。这种讨论是否也适用于硬件内存模型,即CPU ISAs只为正确的可见性序列提供硬保证,而对于延迟可见性的“软”保证?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-03 05:45:28

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

我强烈建议您阅读Intel Itanium处理器族内存排序的形式化规范,因为尽管您可能并不关心Itanium,但它是对硬件内存模型通常关心的问题的极好和可读的描述。

实际上,只要CPU仍在执行指令,它最终将不得不刷新其写操作。此外,只要写入已到达L2缓存或相应的地方,由于缓存一致性协议,它通常对其他CPU是可见的。所以我不认为这是特别担心的事情。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13009411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档