我有一个工作线程,它从 MVar 重复读取数据并执行一些有用的工作。过了一会儿,程序的其余部分忘记了那个工作线程,这意味着它将等待一个空的 MVar 并变得非常孤独。我的问题是:
如果线程不再写入 MVar 是否会被垃圾回收,例如因为它们都在等待它?垃圾收集会杀死等待的线程吗?如果两者都不是,我可以以某种方式向编译器指示应该对 MVar 进行垃圾收集并杀死线程吗?
编辑:我可能应该澄清我的问题的目的。我不希望针对死锁提供一般保护;相反,我想做的是将工作线程的生命周期与一个值的生命周期联系起来(如:垃圾回收声称死值)。换句话说,工作线程是我不想手动释放的资源,而是当某个值(MVar 或派生值)被垃圾收集时。
这是一个示例程序,演示了我的想法
import Control.Concurrent
import Control.Concurrent.MVar
main = do
something
-- the thread forked in something can be killed here
-- because the MVar used for communication is no longer in scope
etc
something = do
v <- newEmptyMVar
forkIO $ forever $ work =<< takeMVar v
putMVar v "Haskell"
putMVar v "42"
换句话说,当我不能再与它通信时,我希望线程被杀死,即当用于通信的 MVar 不再在范围内时。怎么做?