我想从这个link
讨论golang中的以下结构// Local per-P Pool appendix.
57 type poolLocal struct {
58 private interface{} // Can be used only by the respective P.
59 shared []interface{} // Can be used by any P.
60 Mutex // Protects shared.
61 pad [128]byte // Prevents false sharing.
62 }
使用Mutex时,上述结构一次只能访问一个线程。编码器将在线程的开头锁定结构并在线程完成时将其解锁。因此线程之间不共享内存。所以不会超过一个核心 访问内存。所以,根据我的理解,这里不会发生错误共享。如果不能进行错误共享,为什么编码器会填充结构 额外的字节(填充[128]字节)?我的理解错了吗?
答案 0 :(得分:2)
同一缓存行上的内存位置会受到错误共享的影响,这对性能非常不利。 缓存行大小范围为 32到128 字节,具体取决于处理器型号。 128字节的填充将减少不同进程使用相同缓存行的机会,并降低性能
正如我所看到的,以下情况会更好,因为它会更明确
type poolLocal struct {
_ [64]byte // Prevents false sharing.
private interface{} // Can be used only by the respective P.
shared []interface{} // Can be used by any P.
Mutex // Protects shared.
_ [64]byte // Prevents false sharing.
}