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