我有一个工作线程反复从MVar读取数据并对其进行一些有用的工作。一段时间后,程序的其他部分会忘记这个工作线程,这意味着它将等待空的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进行通信时(即MVar不再在作用域内),线程能够被终止。如何实现?