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 がスコープ外になったときに、スレッドを強制終了したいと考えています。どうやってするか?