トップ «前の日記(2004-11-14) 最新 次の日記(2004-11-16)» 月表示 編集

日々の流転


2004-11-15 [長年日記]

λ. るびま 0003号

きたー。

Tags: ruby

λ. 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が変なことになってる?

Tags: haskell