c - 有没有什么可以阻止 CPU 在执行其预定的设置操作之前等待很长时间?

标签 c multithreading assembly x86 memory-barriers

假设我有两个共享全局变量 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/

相关文章:

assembly - 6502汇编语言中结构数组相对于并行数组的优势?

c - 扫描文本文件时如何跳过一行?

c - 在 C 上分配结构的动态数组。

c++ - 具有缓冲能力的专用线程(每个连接一个线程)(c/c++)

java - 如何在 Android 中修复 "The application may be doing too much work on its main thread"?

c - NOP 雪橇如何工作?

assembly - X86预取优化:“计算后转到”线程代码

c - 修改终端中已有的文本

c - OpenMP time 和 clock() 给出了两个不同的结果

java - 由于java中的某些条件,如何调用函数来延迟执行?