前言 上篇文章我们介绍了同步原语mutex的使用和注意事项,本章主要介绍mutex的原理以及其是如何实现并发的。
mutex的数据结构
翠花上代码
type Mutex struct {
state int32
sema uint32
}
Mutex的结构体很简单 只有两个字段state和sema state为0代表当前未锁定的互斥锁,也就是说当前的共享数据存在并发的可能性。sema是用于控制锁状态的信号量
互斥锁的状态
翠花上图片:
mutexLocked 代表互斥锁的锁定状态
mutexToken 表示互斥锁唤醒状态
mutexStarving 表示互斥锁进入饥饿状态
waitersCount 表示还有多少协程竞争锁
mutex的方法
翠花上代码:
type Locker interface {
Lock()
Unlock()
}
mutex的锁定和解锁非常简单只有两个方法,Lock和Unlock
情况说明
-
如果对已经加锁的共享变量进行加锁则会阻塞到解锁
-
如果对未加锁的变量进行解锁,则会发生panic。如下示例:
m := sync.Mutex{}
m.Unlock()
num := 0
fmt.Println("=====", num)d
总结:
本章主要是对mutex的进一步学习,其实mutex的代码很适合用来阅读源码,结构和使用都很简单。
最后:
如果有需要可以关注老王的公众号:
宇宇独行