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パターンが想定される。

  1. writeが先に実行されれば、何も表示されない
  2. readが先に実行されれば、”the value is 0"と表示される
  3. readとfmt.Printfの間にwriteが実行されれば、”the value is 1"と表示される

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

Software engineer