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

34
задан Heinrich Apfelmus 3 June 2012 в 17:18
поделиться