Concurrency in Go Chapter1 (4)

Takanori Ishibashi
2 min readSep 27, 2017

--

“Concurrency in Go: Tools and Techniques for Developers”の1章 “An Introduction to Concurrency”の読書メモ。Memory Access Synchronizationについて書く。

2つのプロセスが同じメモリ領域にアクセスすると、Atomicでなくなる。メモリ領域へのアクセスを排他的に行うのが、以下のMutexを使用した例である。(Race Conditionsを回避しようようとしているが正しくない。正しい解決方法は後の章で紹介される。)

package mainimport "sync"
import "fmt"
func main() {
var memoryAccess sync.Mutex
var value int
go func() {
memoryAccess.Lock()
value++
memoryAccess.Unlock()
}()
memoryAccess.Lock()
if value == 0 {
fmt.Printf("the value is %v.\n", value)
} else {
fmt.Printf("the value is %v.\n", value)
}
memoryAccess.Unlock()
}

valueにアクセスする前にLock、valueに対する処理が終わったらUnlockを行っている。非決定的なスコープをわずかに狭めたにすぎず、実質的にはRace Conditionsを解決していない。goroutineとif文のどちらが先に実行されるかは非決定的である。また、あるプロセスがメモリ領域をLockしている状態で、別のプロセスが同じメモリ領域にアクセスしようとする場合、待ちが発生するので、プログラムは遅くなる。

--

--