箸を奪い合う哲学者達
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 ってインタプリタだと動作しませんって書いてあった気がするんだけどな。普通に動いてるけど。よくわからんなぁ。
いろいろ試してたら、
- forkIO を使ってインタプリタで実行すると、しばらくするとなぜか終了する
- forkIO を使ってコンパイルして実行すると、何も出力されない
- forkOS を使ってインタプリタで実行すると、意図通りに動作する
- forkOS を使ってコンパイルして実行すると、しばらくするとなぜか終了する
ということが判明。理由は不明。