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

上記のコードを書きました。しかし、私がそれを実行したとき、私はいつも123しか得られませんでした。456印刷されません。メインスレッドが他のスレッドの前に終了したため、プログラム全体が終了したためだと思います。

どうすればこれを防ぐことができますか? すべてのスレッドが終了した後にメインスレッドが終了したことを確認できるAPIはありますか?

OS: OS X 10.8.3

コンパイラ: ghc 7.4.2

4

2 に答える 2

16

asyncライブラリを使用します。

import Control.Concurrent.Async

main = do
    a1 <- async $ putStrLn "123"
    a2 <- async $ putStrLn "456"
    mapM_ wait [a1, a2]

これは、ダニエルのソリューションと同等ですが、2 つのわずかな利点があります。

  • フォークされたスレッドで発生した例外が、デッドロックを引き起こすことなく、親スレッドで再発生することを保証します
  • より便利です
于 2013-05-22T19:27:24.903 に答える
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)
于 2013-05-22T18:36:01.817 に答える