У меня есть рабочий поток, который многократно считывает данные из 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, используемый для связи, больше не находится в области видимости. Как это сделать?