嗯……——显然,什么都没有!如果我尝试
Prelude Control.Concurrent.Async Data.List> do {_ <- async $ return $! foldl'(+) 0 [0,0.1 .. 1e+8 :: Double]; print "Async is lost!"}
"Async is lost!"
一个处理器内核开始疯狂一段时间,界面保持正常。显然,线程已启动,只要有事情要做,它就会运行。
但是(抛开效率不谈),原则上是可以的,还是必须
Async
s 始终是 cancel
领导或wait
编为?是否因为无法再读取结果而出现问题? GC 是否正确清理了所有内容?也许线程实际上会被停止,而当我尝试它时还没有发生(因为缺乏内存压力)?线程是否完全正确地“结束”了,只是当 forkIO
ed行动结束?我对这个并发的东西很不确定。也许我仍然以 C++ 的方式思考这个问题。 RAII/确定性垃圾收集肯定会让你在这些方面感觉更好一些......
最佳答案
在内部,Async
只是一个写入 STM TMVar
的 Haskell 线程等结束了。一个 cancel
只是向 Haskell 线程发送终止信号。在 Haskell 中,您不需要明确地杀死线程。如果 Async
本身可以被垃圾收集,然后线程仍然会运行到它的末尾,然后一切都会被正确清理。但是,如果 Async
以异常结束,然后 wait
会将异常传播到等待线程。如果你不 wait
,你永远不会知道异常发生了。
关于multithreading - 当 Async 值被垃圾收集时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20402216/