Haskell で STM を使えばデッドロックがなくなる例として、食事する哲学者の問題を考えてみる。 デッドロックするコード 食事する哲学者の問題では、箸がロックの役割を果たす。Haskell の軽量スレッド間でロックを取るには、MVar を使えばよい。以下のコードを走らせると、その内デッドロックする。 module Main where import Control.Monad import Control.Concurrent import System.Random numOfPhilosopher :: Int numOfPhilosopher = 5 type Chopstick = MVar () newChopstick :: IO Chopstick newChopstick = newMVar () getChopstick :: Chopstick -> IO ()