generated at
デッドロック
Goのデッドロックするコード ref 『Go言語による並行処理』 p.11
go
package main import ( "fmt" "sync" "time" ) type value struct { mu sync.Mutex value int } func main() { var wg sync.WaitGroup printSum := func(v1, v2 *value) { defer wg.Done() v1.mu.Lock() defer v1.mu.Unlock() time.Sleep(2 * time.Second) v2.mu.Lock() defer v2.mu.Unlock() fmt.Printf("sum=%v\n", v1.value+v2.value) } var a, b value wg.Add(2) go printSum(&a, &b) go printSum(&b, &a) wg.Wait() }
fatal error: all goroutines are asleep - deadlock! ってエラーが出る


デッドロックを起こすための条件
4つある
相互排他
条件待ち
横取り不可
循環待ち


参考