Я раньше думал, что все реентерабельные функции являются потокобезопасными. Но Я прочитал страницу повторного входа в 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
будет изменен во время выполнения потоков?