package
0.0.0-20240917151801-3e295c8ed30c
Repository: https://github.com/w3liu/algorithm.git
Documentation: pkg.go.dev
# README
Mutex结构体
* Mutex.state表示互斥锁的状态,比如是否被锁定等。
- Locked:表示该Mutex是否已被锁定,0:没有锁定,1:已被锁定。
- Woken:表示是否有协程已被唤醒,0:没有被唤醒,1:已有协程被唤醒,正在加锁过程中。
- Starving:表示该Mutex是否处于饥饿状态,0:没有饥饿,1:饥饿状态,说明有协程阻塞了超过1ms。
- Waiter:表示阻塞等待锁的协程个数,协程解锁时根据此值来判断是否需要释放信号量。
* Mutex.sema表示信号量,协程阻塞等待该信号,解锁的协程释放信号量从而唤醒等待信号的协程。
自旋条件
* 自旋次数要足够小,通常为4,即自旋最多4次
* CPU核数要大于1,否则自旋没有意义,因为此时不可能有其他协程释放锁
* 协程调度机制中的Process数量要大于1,比如使用GOMAXPROCS()将处理器设置为1就不能启用自旋
* 协程调度机制中的可运行队列必须为空,否则会延迟协程调度
Tips
* 加锁后立即使用defer对其解锁,可以有效避免死锁。
* 加锁和解锁应该成对出现,比如同一个函数中,重复解锁会引起panic。