【发布时间】:2012-02-02 17:06:09
【问题描述】:
我曾经认为所有可重入函数都是线程安全的。但是我读了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 中,“可重入函数”被定义为“当被两个或多个线程调用时,其效果保证与线程一样每个人都以未定义的顺序一个接一个地执行函数,即使实际执行是交错的”,维基百科上的那个(imo。非常糟糕)示例不符合
-
在我看来,这个例子是不可重入的:被中断的
swap()不会像预期的那样交换x和y所指向的值(*y可能被设置为2*x) 的初始值。
标签: c multithreading