用于防止错误共享的奇怪代码

时间:2017-01-17 12:52:02

标签: multithreading go mutex 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  }

使用Mutex时,上述结构一次只能访问一个线程。编码器将在线程的开头锁定结构并在线程完成时将其解锁。因此线程之间不共享内存。所以不会超过一个核心 访问内存。所以,根据我的理解,这里不会发生错误共享。如果不能进行错误共享,为什么编码器会填充结构 额外的字节(填充[128]字节)?我的理解错了吗?

1 个答案:

答案 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.
}