多图详解Go的互斥锁Mutex (3)

在正常模式下,如果没有 waiter,或者mutexLocked、mutexStarving、mutexWoken有一个不为零说明已经有其他goroutine在处理了,直接返回;如果互斥锁存在等待者,那么通过runtime_Semrelease直接唤醒等待队列中的 waiter;

在饥饿模式,直接调用runtime_Semrelease方法将当前锁交给下一个正在尝试获取锁的等待者,等待者被唤醒后会得到锁。

总结

Mutex的设计非常的简洁的,从代码可以看出为了设计出这么简洁的代码state一个字段可以当4个字段使用。并且为了解决goroutine饥饿问题,在1.9 中 Mutex 增加了饥饿模式让锁变得更公平,不公平的等待时间限制在 1 毫秒,但同时,代码也变得越来越难懂了,所以要理解它上面的思想需要慢慢的废些时间细细的体会一下了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxfjx.html