2004-11-15 [長年日記]
λ. Concurrent Haskell と FFI
次のようなプログラムをGHCでコンパイルして実行するとプロセスが暴走するっぽい(Windows版とLinux版のGHC 6.2.1 で確認)。原因は良くわからないが、Concurrent Haskell と FFI の組み合わせには気をつけようと思った。
import Control.Concurrent import Foreign foreign import ccall foo :: FunPtr (IO ()) -> IO () foreign import ccall "wrapper" mkCallback :: IO () -> IO (FunPtr (IO ())) main :: IO () main = do mvar <- newEmptyMVar callback <- mkCallback $ mapM_ (putMVar mvar) [0..2] forkIO $ foo callback takeMVar mvar return ()
void foo(void (*bar)(void)) { bar(); }
まだ良く理解してないのだけど、ひょっとして次のようなことが起こっている? foo
を実行するOSスレッドA(Worker Threadではない)は mapM_ (putMVar mvar) [0..]
を実行するためのCHスレッドαを生成し、その終了を待つために眠る。その間に別のOSスレッド(Worker Thread)によってメインのCHスレッドの処理が進んで終了し、他の全てのCHスレッドも殺されてしまう。αに先に死なれてしまったAが変なことになってる?