防止虚假分享的奇怪代码

Strange code for preventing false sharing

我想从这个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  }

由于使用了互斥锁,上述结构一次只能被一个线程访问。编码器将在线程开始时锁定结构并在线程完成时解锁它。所以线程之间不共享内存。所以不会超过一个核心 访问内存。因此,据我了解,虚假共享不会发生。如果不能发生错误共享,为什么编码器要填充结构 有额外的字节(填充[128]字节)?我的理解错了吗?

同一缓存行上的内存位置受制于false-sharing,这对性能非常不利。 缓存行大小范围从 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.
}