如果在MVar / Chan / TQueue读取时无限期阻塞,Haskell线程是否会被GC?

时间:2016-03-30 13:27:57

标签: multithreading haskell

我有一个重复从MVar / Chan / TQueue /等获取的线程,然后进行一些处理。如果该帖子仅剩下对此MVar / Chan / TQueue的引用,那么它是否会被GC格式化,因此会被无限期阻止? (它是MVarChan还是TQueue是否重要?)我们可以依赖这个GC吗?在什么条件下可能不会发生?

如果GC没有发生或被认为太脆弱,那么关闭一个被无限期读取阻塞的线程的首选方法是什么?

1 个答案:

答案 0 :(得分:1)

总而言之,答案是睡眠线程被确定为唯一引用MVarTVar(后退ChanTQueueTMVar等等,并且在某些使用所述引用时被阻止抛出异常,如果未被捕获,将终止该线程。真的很简单。

警告是:

  • 你不知道GC什么时候会运行,或者它会有多么激进(也许MVar已被提升为不经常收集的老一代?),所以你不应该对什么时候做出假设在运行时的眼中,对象变得无法访问。请注意,对于在GC语言中无法访问的任何运行时值都是如此,因此它并不是特定于Haskell并发性的。
  • 理论上很难推断出何时可以访问对象,尤其是在存在优化的情况下。好的,好的。

因此,使用这些运行时触发的异常来关闭线程(并回收其内存)是完全合理的,否则只要您不关心时间安排就会永远睡着当线程被关闭时,只是想要一些模糊的保证,即当运行时需要释放一些内存时,线程可以在某个时刻关闭。这与你在GC语言中超出范围的任何值所做的完全相同的推理 - 在某些时候,也许很快,也许永远,也许从现在起一小时,GC将重新启动这个记忆。如果您需要更严格地控​​制时间等,请不要将任务外包给GC。