Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何在Haskell中强制主线程等待其所有子线程完成_Multithreading_Haskell - Fatal编程技术网

Multithreading 如何在Haskell中强制主线程等待其所有子线程完成

Multithreading 如何在Haskell中强制主线程等待其所有子线程完成,multithreading,haskell,Multithreading,Haskell,在下面的Haskell代码中,如何强制主线程等待其所有子线程完成 我无法使用此链接()中“终止程序”部分给出的forkFinally 当使用TMVar时,我得到了期望的结果。但我想用TVar来做这件事。 请帮忙 module Main where import Control.Monad import Control.Concurrent import Control.Concurrent.STM type TInt = TVar Int transTest :: TInt -> In

在下面的Haskell代码中,如何强制主线程等待其所有子线程完成

我无法使用此链接()中“终止程序”部分给出的forkFinally

当使用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))
主模块
哪里
进口管制
导入控制。并发
导入控制.Concurrent.STM
类型TInt=TVar Int
transTest::TInt->Int->IO()
transTest n t=do
原子级$do

t1我过去所做的是为每个分叉线程创建一个小MVar,然后使用
forkFinally
分叉线程,这样在最后,每个线程都会将一个虚拟值放入MVar(即,我使用MVar作为同步原语)。然后我可以在这些MVAR上调用
takeMVar
等待

我将其包装成一个小助手函数:

forkThread :: IO () -> IO (MVar ())
forkThread proc = do
    handle <- newEmptyMVar
    _ <- forkFinally proc (\_ -> putMVar handle ())
    return handle
forkshread::IO()->IO(MVar())
forkshread proc=do

句柄使用
Control.Concurrent.Thread
包,该包具有
wait
。标准
控件。不能等待并发的
线程。如果您想使用它们,您需要一个单独的信号机制,每个线程都需要显式地报告“我完成了”。请给出一些链接的例子好吗?谢谢。这个问题在2007年Haskell Cafe的一个线程中讨论过,你也会在那里找到一些示例代码:@n.m。看起来该模块在v-0.5中因为某种原因消失了。非常感谢。它很简单,而且确实非常有用。
-- Fork four threads
threads <- forM [5, 3, 7, 1] (\v -> forkThread (transTest n v))

-- Wait for all of them
mapM_ takeMVar threads
-- Runs 'transTest n {5,3,7,1}' in parallel and waits for all threads
_ <- mapConcurrently (transTest n) [5, 3, 7, 1]