эта функция реентерабельна? - PullRequest
1 голос
/ 17 сентября 2009
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;
    }
}

Я думаю, что эта функция реентерабельна, поскольку она не использует глобальную переменную. Он только изменяет аргументы.

Мой вопрос: эта функция реентерабельна? если это так, мой аргумент достаточно хорош?

спасибо заранее

Ответы [ 4 ]

14 голосов
/ 17 сентября 2009

Да, это реентерабельная функция. Возвращаемые функции определяются как функции, которые можно вызывать во время их выполнения (либо из-за рекурсии, либо из-за параллелизма). В этом случае рекурсия спорна, и вы одновременно безопасны (при условии, что параметры разные).

Ваш аргумент в порядке - нет доступа к глобальному или общему состоянию ни к явному, ни к неявному доступу, поэтому вход гарантирован. Это сочетание вашего явного кода и семантики языка C. Другие языки и API могут не иметь этого свойства.

Редактировать: При двойной проверке стандарт ISO C, по-видимому, не повышает безопасность потока strlen. Таким образом, существует небольшая вероятность того, что вы могли бы использовать стандартную библиотеку C с не-потокобезопасным strlen и, таким образом, наследовать от него невозвратный вход.

11 голосов
/ 17 сентября 2009

Да, вы правы, это реентерабельное. Это влияет только на его параметр и его локальные переменные.

Единственный способ, которым разные экземпляры могут мешать, - это если вы передадите им указатели в один и тот же буфер.

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

4 голосов
/ 17 сентября 2009

Да, он реентерабельный, так как он только изменяет свои аргументы

Википедия дает некоторые приятные замечания о том, что должно быть предоставлено для повторного входа:

Для повторного входа, компьютерная программа или программа:

  • Не должно содержать статических (или глобальных) непостоянных данных.
  • Не должен возвращать адрес статическим (или глобальным) неконстантным данным. Должен работать только с данными, предоставленными ему вызывающим абонентом.
  • Не должен полагаться на блокировки одноэлементных ресурсов.
  • Не должен изменять свой собственный код. 1 (если не выполняется в своем собственном уникальном хранилище потоков)
  • Не должен вызывать не входящие компьютерные программы или процедуры.
2 голосов
/ 17 сентября 2009

Вы должны предположить (или проверить), что strlen является реентерабельным (что, вероятно, и есть).

...