go语言sync.mutex
数据结构
type Mutex struct {
state int32
sema uint32
}
Mutex包含了两个字段,分别是state、sema,state表示了当前锁的状态,sema是用于控制锁的一个信号量。这是一个零值可用的结构体,零值表示未加锁
state 字段的最低三位表示三种状态,分别是 mutexLocked mutexWoken mutexStarving ,剩下的用于统计当前在等待锁的 goroutine 数量
- mutexLocked 表示是否处于锁定状态
- mutexWoken 表示是否处于唤醒状态
- mutexStarving 表示是否处于饥饿状态
- waiterShift 表示等待的goroutine数量
Lock
func (m *Mutex) Lock() {
// Fast path: grab unlocked mutex.
if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) {
// 用于辅助race检测器进行手动竞态检查
if race.Enabled {
race.Acquire(unsafe.Pointer(m))
}
return
}
// Slow path (outlined so that the fast path can be inlined)
m.lockSlow()
}
Lock方法首先进行了一次cas操作,尝试将state的值从0改为1,代表首次进行加锁,如果成功直接返回,若是不成功,将调用lockSlow方法进行加锁。
标签:加锁,sync,sema,state,race,Mutex,go From: https://www.cnblogs.com/zpf253/p/17329132.html