Является ли эта функция реентерабельной?

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 является реентерабельным (что, вероятно, есть).