2016-01-13 2 views
0

Я искал определение и использование реентерабельной функции. Но я не мог понять определение, данное на других веб-страницах. Если любой из них знает, что он просто объясняет это?Что такое реентерабельная функция в c?

+3

[Что именно функцию возвратного?] (Https://stackoverflow.com/questions/2799023/what-exactly-is-a-reentrant-function). Если вы этого не понимаете, тогда вам нужно точно сказать, что вы не понимаете. В противном случае мы не можем нацелить какой-либо новый/другой способ объяснить это, если мы не знаем, почему вы не понимаете всех существующих объяснений. – kaylum

+1

Возможно, вам стоит обратиться к http://stackoverflow.com/questions/2799023/what-exactly-is-a-reentrant-function –

ответ

0

Put на простейшем (или же просто, как я сп сделать это, повторно абитуриент функция одна, которая может быть повторно введен , прежде чем он завершил выполнение.

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

Другое - это рекурсия, в которой функция вызывает себя (прямо или косвенно)

Функции повторного входа должны следовать определенным рекомендациям (например, не использовать статические переменные в C), чтобы разные экземпляры их не растоптались друг на друга.

0

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

Так что проблема в этом. Если вы вызываете функцию, и она устанавливает некоторую переменную. вы вызываете эту же функцию до того, как первый вызов будет завершен из другого потока (или прерывания), новый вызов уничтожит измененные вами переменные. Когда прерывающий поток заканчивает выполнение вашей исходной функции, но теперь имеет разные данные. Таким образом, это не удается.

В общем Реентрантная функции защиты от такого рода проблемы

1

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

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

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

Резьба A находится в функции X и увеличивает глобальную переменную. Thread B прерывает Thread A, входит в функцию X, а также увеличивает одну и ту же глобальную переменную.

Поведение и состояние Thread A было изменено (скорее всего, неверно) другим потоком, и поэтому функция, в которой она находилась, не может считаться повторной.

0

Reentrancy применим при параллельном программировании. Функция повторного ввода гарантирует ее функциональность даже тогда, когда функция вызывается (повторно вводится) из одновременных нескольких потоков. Также смотрите на what is reentrant function?

4

Википедия имеет довольно хорошую статью на re-entrancy.

Функция называется reentrant, если она может быть прервана в середине его исполнения, а затем смело назвать снова («вновь вошел») перед его предыдущих вызовов полного исполнения

Что делает один функция не является повторной? Проверьте статью дальше, но примерно:

  • Не используйте статические или глобальные переменные в функции так как они могут быть изменены по времени ваша функция возобновляет

  • Функция не должна изменять свой код (например, некоторые графические подпрограммы низкого уровня могут иметь «привычку» генерировать себя)

  • не называй любую функцию, которая не соответствует двум правилам выше

  • Когда использовать функцию повторного входа? Вот несколько примеров:

    • Функции, выполняемые в контексте прерывания, должны быть повторены.

    • Функции, которые будут вызываться из нескольких потоков/задач, должны быть повторены.

+0

Теперь я понял определение. Где мы должны использовать этот тип функции?. –

+0

Функции, выполняемые в контексте прерывания, должны быть повторены. Функции, которые будут вызываться из нескольких потоков/задач, также должны быть повторены. –

+0

спасибо, теперь я понял, где мы должны это использовать. –

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