下面是一个示例程序的源代码:
当我从 ghci 运行它时, printJob 和 printJob2 都运行良好并将十行写入文本文件。
但是当使用 -threaded 标志编译时,程序只写一行。
我在 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 指出,如果主应用程序早于所有产生的线程退出,那么它们将被杀死并建议在 main 结束时添加延迟。我做到了,正如他预测的那样,它有效。