Периодически встречаю этот термин. И теперь мне действительно нужно четкое объяснение, поскольку я хочу использовать некоторые подпрограммы MPI, которые, как говорят, не являются безопасными для прерываний.
Что означает термин безопасное прерывание?
Ответы (2)
Я считаю, что это другая формулировка для reentrant
. Если функция реентерабельна, ее можно прервать на середине и вызвать снова.
Например:
void function()
{
lock(mtx);
/* code ... */
unlock(mtx);
}
Эту функцию явно могут вызывать разные потоки (мьютекс защитит код внутри). Но если сигнал поступает после lock(mtx)
и функция вызывается снова, она взаимоблокируется. Так что это не безопасно для прерываний.
Код, защищенный от параллельного доступа из прерывания, называется безопасным для прерываний.
Рассмотрим ситуацию, когда ваш процесс находится в критической секции, и возникает асинхронное событие, которое прерывает ваш процесс для доступа к тому же общему ресурсу, к которому процесс обращался до вытеснения.
Это серьезная ошибка, если прерывание происходит в середине кода, манипулирующего ресурсом, и обработчик прерывания может получить доступ к тому же ресурсу. Блокировка может спасти вас!