import Control.Concurrent
main = do
forkIO $ putStrLn "123"
forkIO $ putStrLn "456"
我已经写了上面的代码。但是当我执行它时,我总是只有123
。 456
未打印。我想这是因为主线程在另一个线程之前结束所以整个程序刚刚结束。
我该怎样防止这种情况?在所有线程结束后,任何api都能确保主线程结束吗?
OS:OS X 10.8.3
编译器:ghc 7.4.2
答案 0 :(得分:15)
使用async
库:
import Control.Concurrent.Async
main = do
a1 <- async $ putStrLn "123"
a2 <- async $ putStrLn "456"
mapM_ wait [a1, a2]
这相当于Daniel的解决方案,除了两个小优点:
答案 1 :(得分:9)
import Control.Concurrent
main = do
done <- newEmptyMVar
forkIO $ putStrLn "123" >> putMVar done ()
forkIO $ putStrLn "456" >> putMVar done ()
takeMVar done
takeMVar done
-- OR: replicateM_ 2 (takeMVar done)