Рубрики

Реентерабельная функция

Функция называется реентерабельной, если есть возможность прерывать функцию в ходе выполнения, обслуживать подпрограмму обработки прерывания и затем возобновлять ранее активную функцию, не препятствуя ее более раннему курсу действий. Повторно используемые функции используются в таких приложениях, как обработка аппаратных прерываний, рекурсия и т. Д.

Функция должна удовлетворять определенным условиям, чтобы называться реентерабельными:
1. Он не может использовать глобальные и статические данные. Хотя нет никаких ограничений, но это, как правило, не рекомендуется. потому что прерывание может изменить определенные глобальные значения, и возобновление действия реентерабельной функции с новыми данными может дать нежелательные результаты.

2. Он не должен изменять свой собственный код. Это важно, потому что ход действия функции должен оставаться неизменным во всем коде. Но это может быть разрешено в случае, если подпрограмма прерывания использует локальную копию реентерабельной функции каждый раз, когда она использует разные значения или до и после прерывания.

3. Не следует вызывать еще одну не реентерабельную функцию.

Потокобезопасность и функции Reentrant
Повторный вход отличается от, но тесно связан с безопасностью потока. Функция может быть поточно-ориентированной и все же не входящей. Например, функцию можно обернуть мьютексом (что позволяет избежать проблем в многопоточных средах), но если эта функция используется в подпрограмме обработки прерываний, она может голодать, ожидая первого выполнения, чтобы освободить мьютекс. Ключом к тому, чтобы избежать путаницы, является то, что reentrant относится только к выполнению одного потока. Это концепция того времени, когда не существовало многозадачных операционных систем. (Источник: https://en.wikipedia.org/wiki/Reentrancy_(computing) )

Пример не реентерабельных функций:

// Не реентерабельный пример
// [Функция зависит от глобальной переменной i]

  

int i;

  
// fun1 () и fun2 () не являются реентерабельными

  
// fun1 () НЕ реентерабелен, потому что он использует глобальную переменную i

int fun1()

{

    return i * 5;

}

  
// fun2 () НЕ реентерабелен, потому что он вызывает не реентерабельный
// функция

int fun2()

{

   return fun1() * 5;

}

Пример реентерабельных функций:
В приведенном ниже коде fun2 является реентерабельной функцией. Если прерывание приостанавливает его выполнение и переключает управление на fun1. После завершения fun1 управление снова передается fun2, и он снова входит в фазу выполнения.

// Fun1 () и fun2 () являются реентерабельными

int fun1(int i)

{

    return i * 5;

}

  

int fun2(int i)

{

   return fun1(i) * 5;

}

Статья составлена Венки . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Реентерабельная функция

0.00 (0%) 0 votes