我有一个重复从MVar
/ Chan
/ TQueue
/等获取的线程,然后进行一些处理。如果该帖子仅剩下对此MVar
/ Chan
/ TQueue
的引用,那么它是否会被GC格式化,因此会被无限期阻止? (它是MVar
,Chan
还是TQueue
是否重要?)我们可以依赖这个GC吗?在什么条件下可能不会发生?
如果GC没有发生或被认为太脆弱,那么关闭一个被无限期读取阻塞的线程的首选方法是什么?
答案 0 :(得分:1)
总而言之,答案是睡眠线程被确定为唯一引用MVar
和TVar
(后退Chan
,TQueue
, TMVar
等等,并且在某些使用所述引用时被阻止将抛出异常,如果未被捕获,将终止该线程。真的很简单。
警告是:
因此,使用这些运行时触发的异常来关闭线程(并回收其内存)是完全合理的,否则只要您不关心时间安排就会永远睡着当线程被关闭时,只是想要一些模糊的保证,即当运行时需要释放一些内存时,线程可以在某个时刻关闭。这与你在GC语言中超出范围的任何值所做的完全相同的推理 - 在某些时候,也许很快,也许永远,也许从现在起一小时,GC将重新启动这个记忆。如果您需要更严格地控制时间等,请不要将任务外包给GC。