Mutex

2022-04-05  本文已影响0人  wayyyy
type Mutex struct {
    state int32
    sema uint32
}
简单加锁
image.png
加锁被阻塞
image.png
简单解锁
image.png
解锁并唤醒协程
image.png
自旋

加锁时,如果当前的 Locked 位为1,说明当前该锁由其他协程持有,尝试加锁的协程并不马上转入阻塞,而是会持续地探测 Locked 位是否变为0,这个过程称为自旋。
自旋地时间很短,如果在自旋过程发现锁已经被释放,那么协程可以立即获取锁,此时即便有协程被唤醒,也无法获取锁,只能再次阻塞。自旋的好处是,当加锁失败时不必立即转入阻塞,有一定机会获取到锁,这样可以避免协程的切换。

mutex 模式

每个Mutex 都有2种模式,称为 Normal 和 Starving

woken 状态

Woken 状态用于加锁和解锁过程中的通信,同一时刻,两个协程一个在加锁,另一个在解锁,在加锁的协程可能在自旋过程中,此时把woken 标记为1,用于通知解锁协程不必释放信号量。

上一篇 下一篇

猜你喜欢

热点阅读