Является ли эта функция реентерабельной?
void reverse_string(char* string, int str_size) {
char tmp;
int i = 0;
int j = str_size - 1;
while (i < j) {
tmp = string[i];
string[i] = string[j];
string[j] = tmp;
++i;
--j;
}
}
Я думаю, что эта функция реентерабельная, поскольку она не использует глобальную переменную. Он изменяет только аргументы.
Мой вопрос:
является ли эта функция реентерабельной?
если это так, мой аргумент достаточно хорош?
заблаговременно
Ответы
Ответ 1
Да, это повторная функция. Функции реентера определяются как те, которые можно назвать, пока они сами выполняют (либо из-за рекурсии, либо concurrency). В этом случае рекурсия является спорной, и вы одновременно безопасными (при условии, различающиеся параметров).
Ваш аргумент в порядке - нет глобального или общего состояния, к которому обращаются явно или неявно, поэтому обеспечивается повторная регистрация. Это комбинация как вашего явного кода, так и семантики C. Другие языки и API могут не иметь этого свойства.
Изменить: при двойной проверке стандарт ISO C, похоже, не заставляет безопасность потока strlen. Таким образом, существует небольшая вероятность того, что вы можете использовать стандартную библиотеку C с безопасным strnen, не связанным с потоком, и, как таковой, наследовать от него не-повторно.
Ответ 2
Да, вы правы, это реентера. Это влияет только на его параметр и его локальные переменные.
Единственный способ, которым могли бы повлиять разные экземпляры, - это передать их указателям в один и тот же буфер.
Там хорошее определение реентера в Википедии, и ваша функция четко соответствует всем условиям.
Ответ 3
Да, он реентерабельен, так как он только изменяет свои аргументы
Wikipedia дает некоторые приятные моменты в отношении того, что должно быть предоставлено, чтобы быть реентерабельным:
Чтобы быть реентерабельной, компьютерная программа или подпрограмма:
- Нельзя хранить статические (или глобальные) непостоянные данные.
- Нельзя возвращать адрес статическим (или глобальным) непостоянным данным.
Необходимо работать только с данными, предоставленными ему вызывающим абонентом.
- Не следует полагаться на блокировки для ресурсов singleton.
- Не нужно изменять свой собственный код. 1 (если не выполняется в своем собственном уникальном хранилище потоков)
- Нельзя вызывать нерентабельные компьютерные программы или подпрограммы.
Ответ 4
Вам нужно будет (или проверить), что strlen
является реентерабельным (что, вероятно, есть).