我曾經認爲所有可重入函數都是線程安全的。不過,我看到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
將被更改?
這個例子不是有點人爲的。但是,重入和線程安全是正交的概念。 – 2012-02-02 17:24:13
Posix有重入的另一個定義「在POSIX.1c中,一個」可重入函數「被定義爲一個函數,當兩個或多個線程調用時,它的作用保證就好像每個線程都一個接一個地執行函數以一個未定義的順序,即使實際的執行是交錯的「,這在維基百科上的那個(imo。相當不好)示例將不符合 – nos 2012-02-02 18:20:43
在我看來,這個例子不是可重入的:中斷的'swap()'會不按預期交換'x'和'y'指向的值(無論'* x'的初始值如何,'* y'可能設置爲2)。 – rom1v 2018-01-07 00:03:47