并发
- 找出哪些部分可以并行完成,哪部分必须是顺序的
- goroutines很便宜,但不免费。
- 优化多线程代码
- 共享false -> 填充缓存行大小
- 共享true -> 分片
- 与上一节关于缓存和虚假/真实共享重叠
- 延迟同步; 它很贵,所以复制工作可能会更便宜
- 你可以控制的东西:worker的数量,批量大小
你需要一个互斥体来保护共享的可变状态。如果你有很多的互斥量争用,你需要减少共享,或者减少mutable。减少共享的两种方法是1)分割锁或2)独立处理,然后合并。为了减少mutable:好吧,让你的数据结构是只读的。你还可以通过减少关键部分来缩短数据共享的时间 - 尽可能少地锁定锁定。有时候RWMutex就足够了,但是请注意,它们比较慢,但是它们允许多个读者进入。
如果你正在分解锁,请注意共享缓存行。您需要填充以避免缓存行拥有权在处理器之间弹跳。
var stripe [8]struct{ sync.Mutex; _ [7]uint64 } //互斥量为64位; 填充填充缓存行的其余部分