我编写了一个多线程应用来测试运行LOCK CMPXCHG(x86 ASM)的速度。
在我的机器上(双核 - 核心2),运行2个线程并访问相同的变量,我可以执行大约40M操作/秒。
然后我给每个线程一个唯一的变量来操作。显然这意味着线程之间没有锁定争用,所以我期望速度性能。但是,速度并没有改变。为什么呢?
答案 0 :(得分:14)
如果有2个线程同时访问位于同一缓存行的数据,则会得到 false sharing ,其中每个核心必须不断更新其缓存,因为缓存的相同部分已被更改其他核心。
确保在不同的内存块中分配唯一变量(比如至少相隔128个字节),以确保这不是您遇到的问题。
DDJ有一篇很好的文章描述了虚假分享的可怕影响:http://www.drdobbs.com/go-parallel/article/showArticle.jhtml?articleID=217500206
这是维基百科上的条目:http://en.wikipedia.org/wiki/False_sharing