Что означает термин безопасное прерывание?

Периодически встречаю этот термин. И теперь мне действительно нужно четкое объяснение, поскольку я хочу использовать некоторые подпрограммы MPI, которые, как говорят, не являются безопасными для прерываний.


person cpp_noname    schedule 30.06.2011    source источник


Ответы (2)


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

Например:

void function()
{
    lock(mtx);
    /* code ... */
    unlock(mtx);
}

Эту функцию явно могут вызывать разные потоки (мьютекс защитит код внутри). Но если сигнал поступает после lock(mtx) и функция вызывается снова, она взаимоблокируется. Так что это не безопасно для прерываний.

person cnicutar    schedule 30.06.2011
comment
@RestlessC0bra В вашем примере неявно предполагается рекурсивная блокировка, которую некоторые считают плохой. - person cnicutar; 04.01.2017
comment
@ RestlessC0bra Допустим, поток получает мьютекс. Затем тот же поток обрабатывает сигнал и каким-то образом начинает выполнять функцию заново (это все вполне обычно). Если блокировки не являются рекурсивными (а этого не должно быть), единственный поток заблокирован. - person cnicutar; 04.01.2017

Код, защищенный от параллельного доступа из прерывания, называется безопасным для прерываний.

Рассмотрим ситуацию, когда ваш процесс находится в критической секции, и возникает асинхронное событие, которое прерывает ваш процесс для доступа к тому же общему ресурсу, к которому процесс обращался до вытеснения.

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

person zafarulq    schedule 11.04.2013