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