func (m *Mutex) lockSlow() {
…
for {
…
if atomic.CompareAndSwapInt32(&m.state, old, new) {
…
if old&mutexStarving != 0 {
delta := int32(mutexLocked - 1<<mutexWaiterShift)
if !starving || old>>mutexWaiterShift == 1 {
delta -= mutexStarving
}
atomic.AddInt32(&m.state, delta)
break
}
awoke = true
iter = 0
}
}
}
I don’t fully understand the locking logic of sync.Mutex
in Go’s source code.
If a Goroutine enters starvation mode and mutexWaiterShift == 1
at that moment, then starvation mode is removed. If a new Goroutine tries to acquire the lock at this point, will it be able to succeed?