以下はサンプルプログラムのソースです。
ghci から実行すると、printJob と printJob2 の両方が正常に実行され、10 行がテキスト ファイルに書き込まれます。
しかし、-threaded フラグを指定してコンパイルすると、プログラムは 1 行しか書き込みません。
ArchLinuxにghc 7.0.3があります
コンパイルコマンドは次のとおりです。
ghc -threaded -Wall -O2 -rtsopts -with-rtsopts=-N -o testmvar testmvar.hs
私は何を間違っていますか?スレッドモードで動作しないのはなぜですか?
import Control.Concurrent.MVar
import Control.Concurrent (forkIO)
import Control.Exception (bracket)
import Control.Monad (forM_)
import System.IO.Unsafe (unsafePerformIO)
import System.IO (hPutStrLn, stderr)
{-# NOINLINE p #-}
p :: MVar Int
p = unsafePerformIO $ newMVar (1::Int)
{-# NOINLINE printJob #-}
printJob x = bracket (takeMVar p) (putMVar p . (+ 1))
(\a -> do
appendFile "mvarlog.txt" $ "Input: " ++ x ++ "; Counter: " ++ show a ++ "\n"
)
{-# NOINLINE printJob2 #-}
printJob2 = unsafePerformIO $ do
p2 <- newEmptyMVar
return $ (\x -> bracket (putMVar p2 True) (\_ -> takeMVar p2)
(\_ -> do
appendFile "mvarlog.txt" $ "preformed " ++ x ++ "\n"
))
main = do
forM_ [1..10]
(\x -> forkIO $ printJob (show x))
編集: hammar は、メイン アプリケーションが生成されたすべてのスレッドよりも早く終了した場合、それらは強制終了され、メインの最後に遅延を追加するよう提案されることを指摘しました。私はそうしました、そして彼が予測したように、それはうまくいきます.