我发现自己试图写这样的东西:
main = do t1 <- forkIO (forever io)
t2 <- forkIO (forever io)
forever io
`finally` traverse_ killThread [t1,t2]
但t1
和t2
无法在finally
中访问,因为它不在monad中。
由于此处的IO操作是永久运行的,因此主要关注的是让线程有机会在用户中断或最后一次IO操作中IOException
时干净地退出。
我知道像async
和threads
之类的软件包对此非常有用,但是可以使用基本并发原语轻松完成吗?
killThread
会很好。什么时候不想要那个?
答案 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中编写代码以等待子线程在完成之前完成。