让我们说我有两个共享全局变量x
的线程。
Thread A
的工作是将值设置为x
,Thread B
的工作是阅读x
。现在每个线程(或我认为的每个核心)都将有一个x
的缓存副本。
我们假设Thread A
已将x
的值设为12345
。现在Thread A
的缓存可以保持不变,因为CPU可以调度稍后执行的设置操作,因此缓存一致性协议不会起作用,因此当Thread B
读取值时x
,它会读取旧值。
我的问题是:在执行预定的集合操作之前,有什么能阻止CPU等待很长时间(例如:10分钟)吗?
注意: 我知道我可以使用内存屏障来强制CPU立即执行其预定的设置操作,但我很想知道是什么如果我不使用内存屏障,就会发生这种情况。
答案 0 :(得分:2)
在过去的15年里,我没有读过的CPU文档说明了在比Y"之前可见X更明确的同步内存所需的时间。这样做的原因是因为内存协议非常复杂,因此在写入变得可见(DMA,纠错,TLB查找,SMM等)之前几乎不可能设置上限。
你可以构建一个理论场景,你的写作永远不可见,事实上,如果你想这样做只是找到CPU的勘误文档,他们会有很多例子说明如何发生。但在实践中?不,你永远不会等待10分钟。您正在运行的内核将接收将执行内存读取和写入的中断,这些中断将刷新存储缓冲区并逐出缓存行。
话虽这么说,你仍然应该使用内存同步,但出于不同的原因。用于强制执行订购。如果值x
是您想要发送到另一个线程的唯一信息,它最终将变得可读,您可以逃避不同步。但这几乎不是这种情况。通常,值x
可以说值y
包含一些有趣的内容,并且当y
对其他人可见时,您需要正确同步以了解x
具有正确的内容线程。