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

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
21
задан ulidtko 25 March 2013 в 01:37
поделиться

5 ответов

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

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

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

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

16
ответ дан unwind 16 October 2019 в 23:40
поделиться

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

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

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

23
ответ дан user34005 16 October 2019 в 23:40
поделиться

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

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

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

10
ответ дан philsquared 16 October 2019 в 23:40
поделиться

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

10
ответ дан 16 October 2019 в 23:40
поделиться

Вот это:

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

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

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

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

, Таким образом, у нас есть две вещи.

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

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

3
ответ дан Johannes Schaub - litb 16 October 2019 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: