Slide 48
Slide 48 text
デッドロック
sumは、引数を2つ取って、
アトミック性を確保するため
に受け取った第1引数を排他
的権利でロックします。
特定の引数で並行して起動す
ると、お互いのロックする変
数を待ち合います。
これは外部から止めることが
できません。
48
type value struct {
mu sync.Mutex
value int
}
func main() {
var wg sync.WaitGroup
sum := func(v1, v2 *value) {
defer wg.Done()
v1.mu.Lock()
defer v1.mu.Unlock()
time.Sleep(time.Second * 2) // 戦犯
v2.mu.Lock()
defer v2.mu.Unlock()
fmt.Printf("%d+%d=%d\n", v1.value, v2.value,
v1.value+v2.value)
}
a := value{value: 10} // 値初期化
b := value{value: 20}
wg.Add(2)
go sum(&a, &b) // sum起動その1
go sum(&b, &a) // sum起動その2
wg.Wait()
}