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