我在C中写了一些低级同步代码。我遇到了一个问题:
假设在x86_64计算机上运行了两个线程Thread A
和Thread B
。 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);
我的问题是:是否存在 delta ,
任何 t1 和 t2 t2 - t1>增量即可。 Thread B
是了解Thread A
在 t1 时写的最新值。
我已经阅读了英特尔和AMD的文件,他们没有提到这样的保护人是否存在。我知道这个值可能取决于处理器型号甚至主板设计(对于多插槽机器)。我想在任何理智的x86_64机器上都必须对这种延迟有一些限制。
我知道如何使用锁定或内存屏障之类的同步原语来保护这种行为。我只需要知道是否存在这样一种保证延迟,使内存访问变得全局可见。
非常感谢!!
答案 0 :(得分:1)
是的,存在这样的增量:x86内存是连贯的,但我认为实际的最大增量没有任何保证。论文Comparing Cache Architectures and Coherency Protocols on x86-64 Multicore SMP Systems可能会让您感兴趣(虽然它是基准,而不是正式的文档)。
应声明AFAIK foo
volatile
以强制编译器实际添加写入指令而不是优化它。
答案 1 :(得分:1)
我很确定无法保证一个CPU写入内存位置与另一个CPU查看内存位置之间的最长时间。在NUMA系统中,一致性协议将花费很长时间。在实践中它将尽可能快,但我怀疑有任何保证。
为什么你需要知道这个?当您编写同步原语时,您只需要考虑排序。 x86_64强制实施强一致性,这意味着其他CPU会按照发生的顺序看到商店,这是您唯一需要担心的事情。