Concurrency in Go Chapter1 (5)
2 min readSep 28, 2017
“Concurrency in Go: Tools and Techniques for Developers”の1章 “An Introduction to Concurrency”の読書メモ。Deadlockについて書く。
Deadlock
Deadlockとはプロセス同士が互いの処理終了を待ち、結果としてどの処理も先に進めなくなってしまい、外部からの介入なしに回復できない状態である。Deadlockが発生するコードを以下に示す。
package mainimport (
"fmt"
"sync"
"time"
)func main() {
type value struct {
mu sync.Mutex
value int
} 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()
}
Deadlockは以下の4つの状態(Coffman conditions)を満たす時に発生しうる。
Mutufal Exclusion
- プロセスが常時、あるリソースを排他的に獲得している
Wait For Condition
- プロセスがあるリソースを確保しつつ、別のリソースを確保しようと待っている
No Preemption
- あるプロセスに確保されているリソースはそのプロセスによってのみ開放される
Circular Wait
- プロセス1がプロセス2を待ち、プロセス2がプロセス1を待っている