Идея повторного входа заключается в том, что подпрограмма может быть вызвана, когда она уже находится в середине выполнения, и она все еще будет работать правильно.
Обычно это достигается с помощью использования только параметров и локальных переменных.объявлено в стеке (в терминах C, нет static
localals).Также было бы важно, чтобы он не блокировал никакие глобальные ресурсы во время выполнения.
Теперь вы можете спросить: «Как могла бы произойти такая странная вещь, как подпрограмма, запускаемая несколько раз за раз?»Вот некоторые из возможных способов:
- Подпрограмма рекурсивная (или взаимно-рекурсивная с некоторым другим набором подпрограмм).
- Она вызывается другим потоком.
- Он вызывается прерыванием.
Если произойдет что-либо из этого, и подпрограмма модифицирует глобальный (или C static
локальный), то новое выполнение может потенциально уничтожитьизменения, сделанные в первом исполнении.Например, если этот глобал использовался в качестве переменной управления циклом, это может привести к тому, что первое выполнение, когда он, наконец, возобновит работу, зацикливается неверное число раз.