Disruptor - 环形缓冲区

5

2
这与伪共享有关, 请查看: https://dev59.com/L14c5IYBdhLWcg3wOoAH#28181831 https://en.wikipedia.org/wiki/False_sharing - Justin
1个回答

8

这是为了确保实际使用的long值位于它自己的缓存行上。这可以避免伪共享,其中有两个需要由不同线程更新的长整型争夺同一缓存行。

这里的假设是CPU缓存行长度为64字节(在大多数架构中都是如此,例如ARM、AMD和Intel CPU)。使用7个long略微有些谨慎,因为头部最小为8字节,最大为16字节(具体取决于分配对齐),因此6个甚至5个long值就足够了。


2
虚假共享并没有想到,实际上LMAX的白皮书提到了缓存行,在看到你的答案后我记起来了,但似乎我没有认真对待它,无论如何感谢你指引我到正确的地方。 - Humoyun Ahmad
2
我在Martin Thompson(Mechanical Sympathy)的博客上发现了一篇关于False Sharing非常有用的文章。http://mechanical-sympathy.blogspot.kr/2011/07/false-sharing.html - Humoyun Ahmad
1
@shibumi 如果您创建两个RingBuffers,则可以在没有填充的情况下使用相同的缓存行。 - Peter Lawrey
1
@shibumi 数组是对象,不是编码对象的一部分。理论上它们可以存在于内存中的任何位置。 - Peter Lawrey
1
@PeterLawrey 我不太理解标题部分,缓存行是64字节。该值左侧和右侧都用7个long进行了填充,留下4字节的空间。为什么不再填充一个long以使其达到64字节呢?我觉得我可能漏掉了一些基本的东西,但很抱歉我有点傻。 - chrisckwong821
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接