Mutex
mutex 数据结构
type Mutex struct {
state int32
sema uint32
}
mutex 2种工作模式
正常模式:正常模式下G会自旋几次,如果自旋都不能获取锁,则进入信号量排队,当一个等待着被唤醒后,不会直接用有锁,而是和后来者竞争,如果湖区不到锁,它会重新插入到 队列头部, 当一个G本次加锁时间超过了1ms,则进入饥饿模式 饥饿模式:mutex所有权从unlock的G直接传给多列头部的G,后来者不会自旋,直接进入队列尾部排队。当一个等待着获取锁后,两种情况会将接模式改为正常模式, 1、它是最后一个等待者,即等待队列为空 2、它的等待时间小于1ms
mutex状态
mutexLocked = 1 << iota // mutex is locked
mutexWoken
mutexStarving
mutexWaiterShift = iota
lock 与unlock fastpath
lock:通过1次cas操作, unlock:原子操作stat减去mutexLocked,新值不为0则需要唤醒某个G,
lock slowpath
如果当前锁,不是饥饿模式,且已经锁定,并且自旋条件允许,则进入自旋 自旋条件:GOMAXPROCS > 1 && 至少一个其他的P在运行 && 当前p的本地runq为空 尝试设置mutexWokend标识位,避免unlock方法唤醒过多的G,mutex自旋上限次数为4,