A Tour of Go in Haskell

GitHub Language
sync.Mutex

これまでチャネルが軽量スレッド間の通信に便利なツールであることを見てきました。 しかしチャネルで解決できない (あるいは解決が難しい) 別のユースケースもあります。 たとえばスレッドどうしで変数を共有してコンフリクトを起こさずにお互いが書き換える場合です。

Go はそういった問題に対して古典的な Mutex を提供しています。 Haskell では STM の道具箱に入っている TVar が使えます。 TVar の方が Mutex より直接的に問題を解決できます。 使い方は TQueue とよく似ています。

var <- newTVar x     -- make new TVar storing x
x <- readTvar var    -- read current value from TVar
modifyTVar var func  -- modify TVar by func lazily
modifyTVar' var func -- modify TVar by func strictly

右のサンプルコードでは TVar を使って複数のスレッドから安全に更新可能なカウンターを構築しています。 STM の atomicallyトランザクション (割り込むことのできない処理) を作るので、 カウンターの更新がコンフリクトを起こすことはありません。

< 9 / 11 >