主线程终止时清除子线程

时间:2014-02-21 09:34:34

标签: multithreading haskell concurrency

我发现自己试图写这样的东西:

main = do t1 <- forkIO (forever io)
          t2 <- forkIO (forever io)
          forever io
          `finally` traverse_ killThread [t1,t2]

t1t2无法在finally中访问,因为它不在monad中。

由于此处的IO操作是永久运行的,因此主要关注的是让线程有机会在用户中断或最后一次IO操作中IOException时干净地退出。

我知道像asyncthreads之类的软件包对此非常有用,但是可以使用基本并发原语轻松完成吗?

顺便说一句,让运行时自动向所有子线程发送killThread会很好。什么时候不想要那个?

2 个答案:

答案 0 :(得分:2)

刚才意识到包含monadic代码块中的finally没有问题。

main = do t1 <- forkIO (forever io)
          t2 <- forkIO (forever io)
          forever io `finally` traverse_ killThread [t1,t2]

如果有人发现有问题,我不会将此问题标记为已回答。

答案 1 :(得分:0)

您不需要终止子线程,因为Haskell运行时会在主线程终止时终止它们。通常,您在main中编写代码以等待子线程在完成之前完成。