不明显的僵局情况



你能解释一下为什么会发生这种僵局吗?

package main
import (
"sync"
"fmt"
"runtime"
)
func main() {
m := sync.RWMutex{}
go func(){
m.RLock()
runtime.Gosched()
m.RLock()
m.RUnlock()
m.RUnlock()
}()
runtime.Gosched()
m.Lock()
m.Unlock()
fmt.Println("works")
}

对我来说,为什么这种僵局

总是主要发生并不明显。这可能是调度程序的怪癖吗?

来自 RWMutex 文档:

如果一个 goroutine 持有一个 RWMutex 用于读取,而另一个 goroutine可能会 调用 Lock,没有 goroutine 应该期望能够获取读取 锁定,直到释放初始读锁定。特别是,这个 禁止递归读取锁定。这是为了确保锁定 最终变得可用;阻止的锁定调用会排除新读取器 从获取锁。

那么当发生死锁时,你的代码中发生了什么:

  1. 第一个 RLock((
  2. Lock((/
  3. /此调用会等到第一个 Rlock(( 释放并阻止对未来 Rlocks(( 的调用
  4. Rlock((//此调用等到 Lock(( 被释放

最新更新