我编写了一个多线程应用程序来对 LOCK CMPXCHG (x86 ASM) 的运行速度进行基准测试。
在我的机器(双核 - Core 2)上,有 2 个线程运行并访问同一变量,我每秒可以执行大约 40M 操作。
然后我给每个线程一个唯一的变量来操作。显然,这意味着线程之间不存在锁定争用,因此我期望速度性能。然而,速度却没有改变。为什么?
最佳答案
如果有 2 个线程同时访问同一缓存行上的数据,则会出现错误共享,其中每个核心都必须不断更新其缓存,因为缓存的同一部分已被更改其他核心。
确保唯一变量分配在不同的内存块中(例如,至少相距 128 个字节),以确保这不是您遇到的问题。
DDJ 有一篇很好的文章描述了虚假共享的可怕影响:http://www.drdobbs.com/go-parallel/article/showArticle.jhtml?articleID=217500206
关于assembly - LOCK CMPXCHG 的线程执行速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3427061/