重复解锁引起panic
mutex 结构
type Mutex struct {
state int32
sema uint32
}
Mutex.state 表示互斥锁的状态,比如是否被锁定
Mutex.sema 表示信号量,协程阻塞等待该信号量,解锁的协程释放信号量从而唤醒等待信号量的协程
Mutex.state 四种状态
Locked 表示Mutex 是否已经被锁定 0 没有 1 锁定
Woken 是否有协程被唤醒 0 没有 1 有协程被唤醒 正在加速过程中
Starving 是否处于饥饿状态 0 没有 1 饥饿状态 说明有协程阻塞超过了1ms
Waiter 阻塞等待协程的个数,协程解锁时根据此值来判断是否需要释放信号量。
2.
自旋过程
自旋好处 当加锁失败时不必立即转入阻塞,有一定机会获得锁,这样可避免协程切换。
满足自旋条件
1.自旋次数要足够少 通常为4 ,自旋最多4次
2. CPU核数要大于1
3.协程调度机制中的Process 的数量要大于1
4.协程调度机制中的可运行队列必须为空,否则会延迟协程调度
Mutex 模式
Normal 模式 默认 满足自旋时可以
Starving 模式 饥饿模式下不会启动 自旋
3
使用defer 避免死锁
加锁后立即使用defer 对其解锁,可以有效地避免死锁
加锁和解锁应该成对出现