>>479
> スレッドがGCされるとき、黙って消されるんじゃなくてrtsが例外を投げてくれる

>>476 の例でも、スレッドがGCされるから、その際にMVarがブロックされ続けている事が分かり、
だから例外 BlockedIndefinitelyOnMVar が投げられるってこと?

ブロックされているのにスレッドがGCされるの?

仕組み以前に、挙動もイマイチ分からんから、別の例を作ったんだが、

main :: IO ()
main = do
m <- newEmptyMVar
forkIO (takeMVar m >> return ())
forever $ print 1

これだと、例外が投げられることもなく、永遠に 1 が印字され続けるが、また別の例

main = do
m <- newEmptyMVar
forkIO (takeMVar m >> return ())
print [1..10000]
_ <- takeMVar m
print [20000..30000]

これだと、10000まで印字されて、20000以降が印字される前に例外が投げられる

要するに、ブロックされているMVarに「全てのスレッドがアクセスしようとした時点」で、
例外が投げられるということなのかな?