是否存在阻止CPU在执行其计划的集合操作之前等待很长时间的任何事情?

时间:2017-03-15 10:54:32

标签: c multithreading assembly x86 memory-barriers

让我们说我有两个共享全局变量x的线程。 Thread A的工作是将值设置为xThread B的工作是阅读x。现在每个线程(或我认为的每个核心)都将有一个x的缓存副本。

我们假设Thread A已将x的值设为12345。现在Thread A的缓存可以保持不变,因为CPU可以调度稍后执行的设置操作,因此缓存一致性协议不会起作用,因此当Thread B读取值时x,它会读取旧值。

我的问题是:在执行预定的集合操作之前,有什么能阻止CPU等待很长时间(例如:10分钟)吗?

注意: 我知道我可以使用内存屏障来强制CPU立即执行其预定的设置操作,但我很想知道是什么如果我不使用内存屏障,就会发生这种情况。

1 个答案:

答案 0 :(得分:2)

在过去的15年里,我没有读过的CPU文档说明了在比Y"之前可见X更明确的同步内存所需的时间。这样做的原因是因为内存协议非常复杂,因此在写入变得可见(DMA,纠错,TLB查找,SMM等)之前几乎不可能设置上限。

你可以构建一个理论场景,你的写作永远不可见,事实上,如果你想这样做只是找到CPU的勘误文档,他们会有很多例子说明如何发生。但在实践中?不,你永远不会等待10分钟。您正在运行的内核将接收将执行内存读取和写入的中断,这些中断将刷新存储缓冲区并逐出缓存行。

话虽这么说,你仍然应该使用内存同步,但出于不同的原因。用于强制执行订购。如果值x是您想要发送到另一个线程的唯一信息,它最终将变得可读,您可以逃避不同步。但这几乎不是这种情况。通常,值x可以说值y包含一些有趣的内容,并且当y对其他人可见时,您需要正确同步以了解x具有正确的内容线程。