Haskell 如何阻止main终止
我有以下代码:Haskell 如何阻止main终止,haskell,Haskell,我有以下代码: main = do _ <- forkIO foo _ <- forkIO bar return () main=do _您可以做的一件事是使用MVar()作为简单的信号量。差不多 main = do vFoo <- newEmptyMVar vBar <- newEmptyMVar forkIO (foo vFoo) forkIO (bar vBar) takeMVar vFoo takeMVar vBa
main = do
_ <- forkIO foo
_ <- forkIO bar
return ()
main=do
_您可以做的一件事是使用MVar()
作为简单的信号量。差不多
main = do
vFoo <- newEmptyMVar
vBar <- newEmptyMVar
forkIO (foo vFoo)
forkIO (bar vBar)
takeMVar vFoo
takeMVar vBar
foo vFoo = do
...whatever...
putMVar vFoo ()
bar vBar = do
...whatever...
putMVar vBar ()
main=do
vFoo您可以调用getChar
,以便主线程等待输入。这也为您提供了一种真正退出程序的便捷方式。或者,如果您不想这样做,只需在getChar
上重复使用async
包即可将其很好地包装为并发foo-bar
下面是一个自包含的堆栈shebang脚本
#!/usr/bin/env stack
{- stack
--resolver lts-6.12
--install-ghc
runghc
--package async
-}
import Control.Concurrent
import Control.Concurrent.Async
forever :: String -> Int -> IO ()
forever msg delay = loop
where
loop = do
putStrLn msg
threadDelay (delay * 1000)
loop
foo = forever "foo" 3000
bar = forever "bar" 5000
main = foo `concurrently` bar
根据您在两个线程中的一个失败的情况下想要的行为,这可能是包的一个好例子
类似于race
和并发的函数可能与您正在做的事情特别相关。甚至可以重用单个MVar
do{v>putMVar v());forkIO(bar>>putMVar v());takeMVar v;takeMVar v}
你也可以这么做,是的。它可能会稍微增加写入错误数量的takeMVar
调用的变化,或者让人不太清楚为什么会有这么多调用,但对于两个线程来说,这可能没问题。