Почему этот код является реентерабельным, но не потокобезопасным

Я раньше думал, что все реентерабельные функции являются потокобезопасными. Но Я прочитал страницу повторного входа в Wiki , он публикует код, который является «полностью реентерабельным, но не потокобезопасным. потому что он не гарантирует, что глобальные данные находятся в согласованном состоянии во время выполнения »

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);
}

Я не понимаю его объяснения. Почему эта функция не является поточно-ориентированной? Причина в том, что глобальная переменная int t будет изменен во время выполнения потоков?

16
задан Dan D. 2 February 2012 в 17:17
поделиться