箸を奪い合う哲学者達

Concurrent Haskell で適当に書いてみる。そしたらなぜかデッドロックしないんですけど。うむぅ。
というか、コンパイルして実行すると、なんとしばらくすると終了してしまうのです。無限ループしてるはずなんだけどなぁ…。

(http://d.hatena.ne.jp/zyxwv/20070830 に原因を書きました)

import Control.Concurrent
main = table
table = do cs1 <- newMVar ()
           cs2 <- newMVar ()
           cs3 <- newMVar ()
           cs4 <- newMVar ()
           forkOS $ philo (cs4,cs1) '1'
           forkOS $ philo (cs1,cs2) '2'
           forkOS $ philo (cs2,cs3) '3'
           forkOS $ philo (cs3,cs4) '4'
philo (cs1,cs2) n =
    do takeMVar cs1
       takeMVar cs2
       print $ "OK! ("++[n]++")"
       putMVar cs1 ()
       putMVar cs2 ()
       philo (cs1,cs2) n

あ、インタプリタだととまらないぞ。しかもちゃんとデッドロックしやがった!
てか forkOS ってインタプリタだと動作しませんって書いてあった気がするんだけどな。普通に動いてるけど。よくわからんなぁ。
いろいろ試してたら、

  1. forkIO を使ってインタプリタで実行すると、しばらくするとなぜか終了する
  2. forkIO を使ってコンパイルして実行すると、何も出力されない
  3. forkOS を使ってインタプリタで実行すると、意図通りに動作する
  4. forkOS を使ってコンパイルして実行すると、しばらくするとなぜか終了する

ということが判明。理由は不明。