2015-10-14 2 views
0

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

Ниже приведен пример функции возвратного из Википедии https://en.wikipedia.org/wiki/Reentrancy_(computing)

int t; 

void swap(int *x, int *y) 
{ 
    int s; 

    s = t; // save global variable 
    t = *x; 
    *x = *y; 

    // hardware interrupt might invoke isr() here! 
    *y = t; 
    t = s; // restore global variable 
} 

void isr() 
{ 
    int x = 1, y = 2; 
    swap(&x, &y); 
} 

Я думал, что, если мы изменим ISR так:

void isr() 
{ 
    t=0; 
} 

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

Я думаю, правильно или неправильно? Есть ли какая-то ошибка в моем понимании реентракции?

ответ

1

Ответ на ваш вопрос:

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

Нет, это не так, потому что повторное включение (по определению) определено по отношению к себе. Если isr ​​вызывает своп, другой обмен будет безопасным. Тем не менее, swap является небезопасным потоком.

Правильный способ мышления зависит от точного определения повторного entrancy и безопасности потоков (см сказать Threadsafe vs re-entrant) Википедии, источник кода в вопросе, выбрало определение функции возвратной быть «если он может быть прерван в середине его выполнения, а затем безопасно снова вызван («повторно введен») до завершения его предыдущих вызовов ».

1

Я никогда не слышал, как термин повторное использование используется в контексте процедур обслуживания прерываний. Как правило, ответственность ISR (и/или операционной системы) заключается в поддержании согласованности - код приложения не должен знать ничего о том, что может сделать прерывание.

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

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

Смежные вопросы