Раньше я думал, что все реентеративные функции являются потокобезопасными. Но я читал Reentrancy page in 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
будет изменена при выполнении потоков?
Этот пример более чем надуман. Но, повторное проникновение и потокобезопасность являются ортогональными понятиями. –
У Posix есть еще одно определение для повторного размещения «В POSIX.1c« реентеративная функция »определяется как« функция, эффект которой при вызове двух или более потоков гарантированно будет таким, как если бы потоки каждый выполняли функцию один за другим в неопределенном порядке, даже если фактическое исполнение чередуется », что пример (очень плохой) в википедии не соответствовал бы – nos
Мне кажется, что этот пример не является реентерабельным: прерванный' swap() 'будет не меняйте значения, обозначенные символами 'x' и' y', как ожидалось ('* y' может быть установлено равным 2 независимо от начального значения' * x'. – rom1v