Concurrency in Go Chapter1 (2)

“Concurrency in Go: Tools and Techniques for Developers”の1章 “An Introduction to Concurrency”の読書メモ。concurrentなコードを書く際に発生していまう可能性のあるRace Conditionsについて書く。

複数の操作が正しい順序で実行されなければならないにも関わらず、プログラムで実行順序が保証されていない場合に、Race Conditionsが発生する。下のコードでは、dataという変数へのreadとwriteがconcurrentに行われている。

package mainimport (
"fmt"
)
func main() {
var data int
go func() {
data++
}()
if data == 0 {
fmt.Printf("the value is %v.\n", data)
}
}

read(data == 0)とwrite(data++)のどちらが先に実行されるかは保証されない。実行結果は以下の3パターンが想定される。

実行ごとに結果が異なる可能性があるため、Race Conditionsは見つけにくいバグの1つである。プログラムが上から順番に逐次実行されると考えてしまうと、パターン1のみを想定してしまう。

--

--

Software engineer

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store