可能你会想,为什么 Go 不能实现得更健壮些,多次执行 Unlock () 也不要 panic?
仔细想想 Unlock 的逻辑就可以理解,这实际上很难做到。Unlock 过程分为将 Locked 置为 0,然后判断 Waiter 值,如果值 > 0,则释放信号量。
如果多次 Unlock (),那么可能每次都释放一个信号量,这样会唤醒多个协程,多个协程唤醒后会继续在 Lock () 的逻辑里抢锁,势必会增加 Lock () 实现的复杂度,也会引起不必要的协程切换。
Woken 状态
Woken 状态用于加锁和解锁过程的通信,举个例子,同一时刻,两个协程一个在加锁,一个在解锁,在加锁的协程可能在自旋过程中,此时把 Woken 标记为 1,用于通知解锁协程不必释放信号量了,好比在说:你只管解锁好了,不必释放信号量,我马上就拿到锁了。
返回搜狐,查看更多