actionIO :: IO a -> IO a
actionIO action = do
mv <- newEmptyMVar --スレッド間通信用の空のMVarの箱をつくる
_tid <- forkIO $ do --スレッドをたてて
result <- try action --actionを実行 成功ならRight 値 例外なら Left eを返す
actionIO action = do
mv <- newEmptyMVar --スレッド間通信用の空のMVarの箱をつくる
_tid <- forkIO $ do --スレッドをたてて
result <- try action --actionを実行 成功ならRight 値 例外なら Left eを返す
putMVar mv result --結果(Either SomeException a)をMVarに入れる
result <- takeMVar mv --メインスレッドでMVarから結果を受ける。入るまで待つ動作。
case result of つまり、actionが終わるまで待って結果を受け取る
Left e -> throwIO e
Right r -> return r
result <- takeMVar mv --メインスレッドでMVarから結果を受ける。入るまで待つ動作。
case result of つまり、actionが終わるまで待って結果を受け取る
Left e -> throwIO e
Right r -> return r
forkIOでスレッドをわけると、普通はその中で起きた例外が親スレッドに伝わらない。
でも、この関数では、例外をつかまえ MVarを通して親スレッドに返している。
0 件のコメント:
コメントを投稿