在所有其他线程结束后,如何确保主线程结束?

时间:2013-05-22 18:30:32

标签: haskell concurrency

import Control.Concurrent
main = do
    forkIO $ putStrLn "123"
    forkIO $ putStrLn "456"

我已经写了上面的代码。但是当我执行它时,我总是只有123456未打印。我想这是因为主线程在另一个线程之前结束所以整个程序刚刚结束。

我该怎样防止这种情况?在所有线程结束后,任何api都能确保主线程结束吗?

OS:OS X 10.8.3

编译器:ghc 7.4.2

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)