2015-05-29 1 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_ должна игнорировать асинхронное исключение, пока оно не вернется. Но «test maskWorker» не печатает «Return». Зачем?Функция mask_ прервана асинхронным исключением

+0

Следующие операции гарантируют, что они не будут прерываться: все из Control.Exception, за исключением throwTo ... – highfly22

ответ

5

mask не блокирует все исключения async, он просто откладывает их до следующего interruptible action. Используйте uniterruptibleMask, чтобы заблокировать все исключения async.

Смежные вопросы