関数型プログラミング言語Haskell Part24
■ このスレッドは過去ログ倉庫に格納されています
0480476
2013/12/23(月) 23:00:30.74> スレッドが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に「全てのスレッドがアクセスしようとした時点」で、
例外が投げられるということなのかな?
■ このスレッドは過去ログ倉庫に格納されています