Async值被垃圾收集时会发生什么?

时间:2013-12-05 14:10:55

标签: multithreading haskell concurrency garbage-collection

嗯...... - 显然,没什么!如果我试试

  

Prelude Control.Concurrent.Async Data.List>做{_< - async $ return $! foldl'(+)0 [0,0.1 .. 1e + 8 :: Double];打印“异步丢失!”}   “异步失败!”

一个处理器核心开始疯狂一段时间,界面保持正常。显然线程已经启动,只要有事可做就会运行。

但是(效率除外),原则上是好的,还是Async始终是cancel led或wait?有什么东西会破坏,因为没有办法再读取结果吗? GC是否正确清理了一切?事实上,这个线程可能会被停止,而当我尝试它时(由于内存压力不足)这种情况还没有发生?只有当forkIO ed动作结束时,线程是否正确地“结束”?

我对这种并发性的东西很不确定。也许我仍然在用C ++方式考虑这个问题。 RAII /确定性垃圾收集肯定会让你在这方面有更好的照顾......

1 个答案:

答案 0 :(得分:7)

在内部,Async只是一个Haskell线程,在完成时写入STM TMVarcancel只是向Haskell线程发送一个终止信号。在Haskell中,您不需要explcititly杀死线程。如果Async本身可以被垃圾收集,那么线程仍将运行到最后,然后一切都将被正确清理。但是,如果Async以异常结束,则wait会将异常传播到等待的线程。如果你没有wait,你永远不会知道发生了异常。

相关问题