本书未发布
Go 源码解析
Go 的互斥锁
type Mutex struct {
state int32
sema uint32
}
锁的概念:一个门上有一把锁,每次只允许一个人进去。第一个人拿到钥匙后进去了,处理完事情出来再把钥匙交给下一个人。下一个人继续如此循环。
分配钥匙:等待钥匙的人通过抢的方式获取🔑,但是新来的人总是能过先抢到钥匙。为了保证公平,记录每个人的等待时间,如果等待时间超过1ms的则优先获取到🔑。
锁的状态:
- 正常状态:没有人等待时间超过1ms
- 饥饿状态:有人等待时间超过1ms
在正常状态下,如果新来的人没拿到🔑,会让他先在门口直接等待🔑,时间是CPU的30个周期。这里称之为:自旋
。不过自旋
的条件很严苛,还必须是多CPU,非饥饿状态。
除了状态,还会记录等待人的数量。