J'ai un fil d'exécution qui lit les données de façon répétée à partir d'un MVar et effectue un travail utile sur ces données. Après un certain temps, le reste du programme oublie ce fil d'exécution, ce qui signifie qu'il attendra un MVar vide et se sentira très seul. Ma question est la suivante :
Le MVar sera-t-il récupéré si les threads n'y écrivent plus, par exemple parce qu'ils l'attendent tous ? La collecte des déchets tuera-t-elle les threads en attente ? Si ce n'est pas le cas, puis-je indiquer d'une manière ou d'une autre au compilateur que le MVar doit être récupéré et que le thread doit être tué ?
EDIT : Je devrais probablement préciser l'objet de ma question. Je ne souhaite pas une protection générale contre les blocages ; au lieu de cela, ce que je voudrais faire est de lier la vie du fil de travail à la vie d'une valeur (comme dans : les valeurs mortes sont réclamées par la collecte des ordures). En d'autres termes, le fil de travail est une ressource que je voudrais libérer non pas manuellement, mais lorsqu'une certaine valeur (le MVar ou un dérivé) est récupérée par le ramassage des ordures.
Voici un exemple de programme qui démontre ce que j'ai en tête
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"
En d'autres termes, je veux que le thread soit tué lorsque je ne peux plus communiquer avec lui, c'est-à-dire lorsque la MVar utilisée pour la communication n'est plus dans la portée. Comment faire ?