0

我想从此链接讨论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 时,上述结构一次只能访问一个线程。编码器将在线程开始时锁定结构,并在线程完成时将其解锁。所以内存不在线程之间共享。所以只有一个内核可以访问内存。所以,据我了解,这里不会发生虚假分享。如果不能发生虚假共享,为什么编码器用额外的字节(pad [128]byte)填充结构?我的理解错了吗?

4

1 回答 1

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.
}
于 2017-01-17T13:32:56.420 回答