【发布时间】:2015-09-06 15:08:40
【问题描述】:
我正在阅读this question about using a bool for thread control 并被@eran 的这个回答所吸引:
仅在单个内核上使用 volatile 就足够了,所有线程都使用相同的缓存。在多核上,如果在一个核上调用了 stop(),而在另一个核上执行了 run(),则 CPU 缓存可能需要一些时间来同步,这意味着两个核可能会看到两个不同的 isRunning_ 视图。
如果您使用同步机制,它们将确保所有缓存都获得相同的值,但代价是程序会暂停一段时间。性能还是正确性对您更重要,取决于您的实际需求。
我花了一个多小时寻找一些声明,说同步原语强制缓存一致性但失败了。我最接近的是Wikipedia:
关键字 volatile 不能保证内存屏障来强制缓存一致性。
这表明内存屏障确实强制缓存一致性,并且由于一些同步原语是使用内存屏障实现的(再次来自维基百科),这是一些“证据”。
但我没有足够的知识来确定是否相信这一点,并确保我没有误解它。
有人可以澄清一下吗?
【问题讨论】:
-
没错,C 和 C++ 中的
volatile关键字对线程同步没有任何作用(不记得 C#)。内存屏障确实强制缓存一致性。您可能想阅读强/弱内存模型和memory ordering。
标签: multithreading caching cpu-architecture multicore memory-barriers