質問・実際の出力
syncパッケージのRWMutexの挙動について理解が及ばないところがあります。
以下のサンプルコードを実行すると、
m.RLock()
の行でfatal error: all goroutines are asleep - deadlock!
が発生してしまいます
https://play.golang.org/p/7zSKwX521IQ
go
1package main 2 3import ( 4 "sync" 5 "time" 6 "fmt" 7) 8 9func main() { 10 var m sync.RWMutex 11 m.Lock() 12 go func() { 13 time.Sleep(3 * time.Second) 14 m.RUnlock() // ① 15 m.Unlock() 16 fmt.Println("unlock 1") 17 }() 18 m.RLock() // fatal error: all goroutines are asleep - deadlock! 19 fmt.Println("unlock 2") 20} 21
期待する挙動
unlock 1 unlock 2
http://golang.jp/pkg/sync
を読む限り、
go routineで実行されているfunc()内でm.Unlock()
を行っているので、Writeのロックが解除され、m.RLock()
でのブロックが発生せず、上のような出力がされると思いました。
実際、①のm.RUnlock()
をコメントアウトすると、期待する挙動通りの出力となります。
m.RUnlock()
を加えることで、ブロックがなぜ発生するのかが理解できません。
初歩的な質問でありますが、どなたかご教示いただけませんでしょうか。
どうぞよろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。