2015-05-29 56 views
0
import Control.Exception 
import System.Timeout 
import Control.Concurrent 

maskWorker :: IO() 
maskWorker = mask_ $ do 
     threadDelay 10000 
     putStrLn $ "Return" 

uninterruptWorker :: IO() 
uninterruptWorker = uninterruptibleMask_ $ do 
     threadDelay 10000 
     putStrLn $ "Return" 

test :: IO() -> IO() 
test worker = do 
      pid <- forkIO worker 
      threadDelay 5000 
      throwTo pid UserInterrupt 
      threadDelay 15000 
      putStrLn "The end" 

函数mask_应该忽略异步异常直到它返回。但“测试maskWorker”不打印“返回”。为什么?函数mask_被异步异常中断

+0

以下操作保证不可中断:除了throwTo ...以外的所有Control.Exception – highfly22

回答

5

mask不会阻止所有的异步异常,它只是推迟它们,直到下一个interruptible action。使用uniterruptibleMask来阻止所有异步异常。