并发

  • 找出哪些部分可以并行完成,哪部分必须是顺序的
  • goroutines很便宜,但不免费。
  • 优化多线程代码
    • 共享false -> 填充缓存行大小
    • 共享true -> 分片
  • 与上一节关于缓存和虚假/真实共享重叠
  • 延迟同步; 它很贵,所以复制工作可能会更便宜
  • 你可以控制的东西:worker的数量,批量大小

你需要一个互斥体来保护共享的可变状态。如果你有很多的互斥量争用,你需要减少共享,或者减少mutable。减少共享的两种方法是1)分割锁或2)独立处理,然后合并。为了减少mutable:好吧,让你的数据结构是只读的。你还可以通过减少关键部分来缩短数据共享的时间 - 尽可能少地锁定锁定。有时候RWMutex就足够了,但是请注意,它们比较慢,但是它们允许多个读者进入。

如果你正在分解锁,请注意共享缓存行。您需要填充以避免缓存行拥有权在处理器之间弹跳。

var stripe [8]struct{ sync.Mutex; _ [7]uint64 } //互斥量为64位; 填充填充缓存行的其余部分