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
调用的变化,或者让人不太清楚为什么会有这么多调用,但对于两个线程来说,这可能没问题。