【发布时间】:2012-02-25 03:48:35
【问题描述】:
我知道这个论坛已经讨论了很多。 但有一件事仍然让我感到困惑。 维基百科提到每个可重入代码都是线程安全的。 http://en.wikipedia.org/wiki/Reentrant_%28subroutine%29 稍后给出一个可重入但不是线程安全的函数的示例。
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);
}
这让我很困惑。所有可重入代码都是线程安全的吗? 此外,所有递归函数都是线程安全的。 我无法想象其中的差异。
谢谢
【问题讨论】:
-
维基文章有“问题”,恕我直言。您粘贴的上面的示例并不是真正的非线程安全的可重入函数,它是对带有故意引入错误的可重入函数的尝试。 swap() 根本不需要全局 't'。只是很傻。如果一个函数可以被中断,重新进入,(从另一个堆栈),然后为一个或两个调用返回错误的结果,它就不是可重入的!线程上下文更改是一个中断,因此可重入函数必须能够将正确的结果返回给所有调用线程。
-
@MartinJames 请参阅我的答案,了解线程安全的不可重入和可重入的非线程安全函数的示例。诚然,两者都有些做作,但我认为它们说明了这一点。
标签: multithreading operating-system