遵守这些规则,就不会有人受伤
1. 你需要锁,即使你没有 SMP。
2. 锁定数据,而不是代码。你的锁应该与特定的数据相关联,而不是代码区域。
3. 粗粒度锁和细粒度锁之间存在一条界线。一方面,细粒度锁通过减少锁竞争来获得更好的可伸缩性。另一方面,你实现的锁越多,你使用的内存和处理周期就越多,锁定语义也变得更加复杂。
4. 当锁持有时间较长时,请考虑不要使用自旋锁。“长”的概念因人而异,但在现代系统上,大约 1-5 毫秒的最大值是一个不错的经验法则。请记住,等待自旋锁的线程会忙等待循环,什么也不做。因此,长时间的锁持有时间会导致 SMP 下的高锁争用以及可抢占内核下的糟糕延迟。相反,由于信号量导致竞争线程睡眠并执行其他代码,因此当等待时间可能很长时,它们是更明智的解决方案。
5. 明智地设计你的锁定语义并坚持使用它们。