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の弱いリファレンスをここで使用できますか? –
@ JohnL:確かにスレッドがMVarを待つ時間を制限し、ウィークポインタがまだ生存しているかどうかを定期的にチェックするとどうなりますか? (弱ポインタは、おそらくMVarと同時にスコープから外れる別の値を指し示す必要があります)理想的には、ガベージコレクションの頻度で期間を指定するのが理想的です。 –
@HeinrichApfelmus:私の最初の編集は基本的にこれを一つの方法で行います。他のスレッドを生成して、ブロックされたスレッドで非同期例外を発生させ、読み込みを中断し、弱いポインタからの再読み込みを強制することをお勧めします。私は今日後でいくつかのコードを試してみるつもりです。しかし、これはまだ、donsの技術で簡単に解決されるもののために、言語の悪名高い部分を使用して、多くの作業のように思えます。 –