Подтвердить что ты не робот

В чем разница между функцией повторного входа и рекурсивной функцией в C?

В C Я знаю о рекурсивной функции, но я слышал о функции повторного входа.

Что это? И в чем разница между ними?

4b9b3361

Ответ 1

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

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

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

[Изменить]: В комментариях есть куча идей, разъяснений и исправлений, поэтому, пожалуйста, прочитайте их также! Спасибо за помощь, ребята.

Ответ 2

Легче запомнить, когда вы понимаете, что означает этот термин.

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

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

Ответ 3

Первоначально сказанное в большинстве случаев правильное - за исключением того, что он не ограничивается многопоточными (также защита глобальных данных с помощью блокировок делает его потокобезопасным, но не обязательно повторным). [Изменить] Он исправил свой пост для объяснения этого сейчас: -)

Функция также может быть повторно введена в том же потоке в результате рекурсии - прямо или косвенно (т.е. функция вызова функции b, которая вызывает функцию c, которая вызывает функцию a).

Конечно, если вы защищаетесь от повторного входа на основе того, что несколько потоков могут его называть, тогда вы также учитываете и рекурсивные случаи. Однако это не так, наоборот.

Ответ 4

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

Ответ 5

Вот он:

  • Повторная функция может вызываться одновременно несколькими потоками при условии, что каждый вызов функции ссылается на уникальные данные.

  • Нить-безопасная функция может вызываться одновременно несколькими потоками, когда каждый вызов ссылается на общие данные. Весь доступ к общим данным сериализуется.

Бесстыдно украдены из руководства Qt. Но это краткое и краткое определение. В принципе, функция без повторного ввода также не recursion-safe.

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

Итак, у нас есть две вещи.

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

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

Ответ 6

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

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

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

означает, что он не должен содержать статическую или общую переменную....

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

И, конечно, помните, что функция повторного входа не такая же, как рекурсивная функция.... совершенно другое понятие....

Подробнее: http://wiki.answers.com/Q/What_is_a_reentrant_function#ixzz1wut38jLF Wiki: http://en.wikipedia.org/wiki/Reentrancy_%28computing%29

Ответ 7

Весь код повторного входа - это рекурсия, но не вся рекурсия является повторной попыткой. Примером для рекурсии является любая функция, которая называет себя прямо или косвенно. Пример для re-entant - это процедуры обработки прерываний.

Ответ 8

Все рекурсивные коды являются повторными... но не все рекурсивные коды рекурсивны.