假设我有两个共享全局变量 x
的线程。
线程A
的工作是设置一个值给x
,线程B
的工作是读取x
。现在每个线程(或者我想是每个内核)都会有一个 x
的缓存副本。
假设 线程 A
已将 x
的值设置为 12345
。现在 Thread A
的缓存可以保持不变,因为 CPU 可以安排 set 操作稍后执行,所以缓存一致性协议(protocol)不会起作用,因此当 Thread B
读取 x
的值,它将读取一个旧值。
我的问题是:是否有什么可以阻止 CPU 在执行其计划的集合操作之前等待很长时间(例如:10 分钟)?
注意:我知道我可以使用内存屏障强制 CPU 立即执行其预定的集合操作,但我很想知道什么如果我不使用内存屏障,就会发生这种情况。
最佳答案
在过去的 15 年里,我读过的任何 CPU 文档都没有用比“X 在 Y 之前可见”更具体的术语来谈论同步内存所花费的时间。这样做的原因是因为内存协议(protocol)非常复杂,几乎不可能在您的写入变得可见(DMA、纠错、TLB 查找、SMM 等)之前设置上限。
您可以构建一个理论上的场景,您的写入永远不会变得可见,事实上,如果您想要这样做,只需找到 CPU 的勘误表文档,他们将提供大量关于如何实现的示例。但实际上呢?不,你永远不会等 10 分钟。您正在运行的内核将接收中断,这些中断将执行内存读取和写入,从而刷新存储缓冲区并逐出缓存行。
话虽如此,您仍然应该使用内存同步,但出于不同的原因。用于执行命令。如果值 x
是您想要发送给其他线程的唯一信息,它最终将变得可读,您可以不用同步。但这种情况几乎从未发生过。通常值 x
表示值 y
包含一些有趣的东西,你需要适当的同步才能知道 y
有正确的内容 x
对另一个线程可见。
关于c - 有没有什么可以阻止 CPU 在执行其预定的设置操作之前等待很长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42807707/