【发布时间】:2015-01-27 11:21:09
【问题描述】:
在下面的 Haskell 代码中,如何强制主线程等待其所有子线程完成。
我无法使用 forkFinally,如此链接中“终止程序”部分所述:(http://hackage.haskell.org/package/base-4.7.0.2/docs/Control-Concurrent.html)。
使用 TMVar 时,我得到了想要的结果。但我想用 TVar 做到这一点。 请帮忙。
module Main
where
import Control.Monad
import Control.Concurrent
import Control.Concurrent.STM
type TInt = TVar Int
transTest :: TInt -> Int -> IO ()
transTest n t = do
atomically $ do
t1 <- readTVar n
doSomeJob t
t2 <- readTVar n
writeTVar n t
doSomeJob :: Int -> STM ()
doSomeJob t = do
x <- newTVar 0
let l = 10^6*t
forM_ [1..l] (\i -> do
writeTVar x i )
main :: IO ()
main = do
n <- newTVarIO 0
let v = 5
forkIO (transTest n v)
let v = 3
forkIO (transTest n v)
let v = 7
forkIO (transTest n v)
let v = 1
forkIO (transTest n v)
r <- atomically $ readTVar n
putStrLn("Last updated value = " ++ (show r))
【问题讨论】:
-
使用具有
wait的Control.Concurrent.Thread包。无法等待标准Control.Concurrent线程。如果你想使用它们,你需要一个单独的信号机制,并且每个线程都需要明确报告“我完成了”。见hackage.haskell.org/package/concurrent-extra-0.3/docs/… -
能否提供一些示例链接?谢谢。
-
这个问题在 2007 年的 Haskell Cafe 线程中讨论过,您还可以在那里找到一些示例代码:(link)
-
@n.m.看起来该模块由于某种原因在 v-0.5 中消失了。