2

我正在用 C 编写一些低级同步代码。我遇到了一个问题:

假设有两个线程Thread AThread B在 x86_64 机器上运行。Thread A在时间t1写入内存位置,之后不再对该位置进行写入。Thread B在时间t2读取相同的内存位置。

Thread A:
    foo = magic_value;  /* happens at t1 */

Thread B:
    bar = foo;  /* happens at t2 */
    assert(bar == magic_value);

我的问题是:对于t2 - t1 > delta的任何t1t2是否存在delta。保证读取在t1写入的最新值。Thread BThread A

我已经阅读了英特尔和 AMD 的文件,他们没有提到是否存在这样的保证。我知道这个值可能取决于处理器型号甚至主板设计(对于多路机器)。我想在当前可用的任何健全的 x86_64 机器上,这种延迟必须有一些限制。

我知道如何使用锁或内存屏障等同步原语来保证这种行为。我只需要知道是否存在这样的保证延迟,以使内存访问变得全局可见。

非常感谢!!

4

2 回答 2

1

是的,存在这样的增量:x86 内存是一致的,但我认为实际最大增量没有任何保证。您可能会对 x86-64 多核 SMP 系统上的比较缓存架构和一致性协议一文感兴趣(尽管它是一个基准,而不是正式文档)。

foo应该声明AFAIKvolatile以强制编译器实际添加写指令而不是优化它。

于 2013-06-27T08:00:02.840 回答
1

我很确定,不能保证一个 CPU 写入内存位置和另一个 CPU 看到它之间的最长时间。在 NUMA 系统中,一致性协议需要很长时间。在实践中,它会尽可能快,但我怀疑是否有任何保证。

为什么你需要知道这一点?当您编写同步原语时,您只需要考虑排序。x86_64 强制执行强一致性,这意味着存储将按照它们发生的顺序被其他 CPU 看到,而这确实是您唯一需要担心的事情。

于 2013-06-27T08:14:20.003 回答