Прерывание также является асинхронным исключением в GHC? - PullRequest
2 голосов
/ 08 апреля 2019

Пытаясь понять, как программы GHC работают с сигналами и исключениями, я обнаружил интересную, но неокончательную дискуссию относительно «исправления» скобки .

Я изо всех сил пытаюсь понять, зачем понадобиться изменение, когда скобка уже маскирует асинхронные исключения .

Мне кажется, что либо прерывание (как в сигналах POSIX) не является асинхронным исключением, либо я упускаю некоторые детали в текущей давней реализации:

bracket before after thing =
  mask $ \restore -> do
    a <- before
    r <- restore (thing a) `onException` after a
    _ <- after a -- can be interrupted??
    return r

В моем понимании, after a должен быть оценен, чтобы обеспечить IO действие, которое будет вызвано монадой IO, которая находится в пределах mask.

РЕДАКТИРОВАТЬ: В то время как на тему, почему after не запускается дважды в случае исключения?

1 Ответ

5 голосов
/ 08 апреля 2019

mask сортировка предотвращает возникновение асинхронных прерываний.

Асинхронные исключения могут по-прежнему приниматься в замаскированном состоянии, если замаскированоthread блокирует определенным образом

Существует другая функция, uninterruptibleMask, которая полностью блокирует асинхронные исключения.

A POSIXПо умолчанию сигнал прерывания приводит к значению AsyncException в главном потоке.Если я правильно понимаю, я не думаю, что это имеет отношение к вашему вопросу.Когда люди говорят «прерываемый», они не имеют в виду конкретно сигнал прерывания POSIX;они означают, что действие является «прерываемым», если оно не было замаскировано с помощью uninterruptibleMask и, следовательно, может получить любое асинхронное исключение из любого источника.

...