bugfix> go > 投稿

このデッドロックが発生する理由を説明していただけますか?

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")
}

このデッドロックの理由は私には明らかではありません常に ほとんど起こります。これはスケジューラの癖ですか?

回答 1 件
  • RWMutexドキュメントから:

    If a goroutine holds a RWMutex for reading and another goroutine might call Lock,no goroutine should expect to be able to acquire a read lock until the initial read lock is released. In particular, this prohibits recursive read locking. This is to ensure that the lock eventually becomes available; a blocked Lock call excludes new readers from acquiring the lock.

    したがって、デッドロックが発生したときにコードで何が起こっているのか:

    最初のRLock()

    Lock()//この呼び出しは、最初のRlock()がリリースされるまで待機し、将来のRlocks()への呼び出しをブロックします

    Rlock()//この呼び出しは、Lock()が解放されるまで待機します

あなたの答え