先週の土曜日にGo Conference 2024に参加してきました。
普段から Go を書いている人間からすると勉強になることが多く
とても刺激になる一日でした。
さて、その中の一つのData Race Detection In Go From Beginners Eyeについてを
聞いていて、Data Race Datectorを読んでないなと思い今回自分なりに解釈して読んでみようと思いました。
Go で実装していると goroutine を実装する時があると思います。
サクッと実装すると以下のような形です。
しかし、単純に1つの goroutine ではなく2つ、 3つと実装したい時があります。
その場合、データ競合が起きる場合同時にアクセスし、
どちらかが1つにアクセスがある場合にエラーが発生します。
以下は例です。
ただ、見た目では判断することが難しいです。
Goではgo run -race
のフラグがあります。
実行すると以下のように、warning
と表示されます
このように競合が発生する場合があります。
以下の場合でもデータ競合が発生します
このように、Goではデータ競合を簡単に抽出することができます。
しかし、抽出コストがメモリ使用量5-10倍、実行時間が2-20倍になることがありあmす。
(プログラムによる)
個人的な使い方としては、テスト実行時に留めておくのがいいかもしれませんね