1

我已经阅读了关于 SO 以及http://en.wikipedia.org/wiki/Reentrancy_(computing)的重入主题的可能主题。

我可能会得到可重入函数的想法。但是当我阅读 wiki 网站上的示例时,我真的很困惑。

第一个例子:

int t;

void swap(int *x, int *y)
{
 t = *x;
 *x = *y;
 // hardware interrupt might invoke isr() here!
 *y = t;
}

void isr()
{
 int x = 1, y = 2;
 swap(&x, &y);
}

正如该站点解释的那样:“它仍然无法重入,如果 isr() 在与已经执行 swap() 的线程相同的上下文中被调用,这将继续导致问题。 ” => 这里可能会发生什么样的问题? 交换结果不正确?还是修改了 t 变量的值?

第二个例子,它改进了第一个例子:

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);
}

这如何改进第一个?这是否意味着变量 t 在 swap() 函数中保持不变?

4

1 回答 1

1

可重入意味着函数可以在任何时候被中断,并且在中断后能够正确完成执行,即使在被中断状态下调用同一个函数一次或多次的情况下。

这里的关键部分是在中断状态下调用的函数的调用必须在恢复原始调用状态之前完成。这是重入和线程安全之间的主要区别:为了线程安全,即使在控制返回原始调用之前中断调用未完成,函数也必须能够继续。

这就是为什么第二个版本swap是可重入的:它总是t在退出时保持不变的状态,因此在中断调用中间进入和退出swap不会改变被中断调用看到的全局状态。

于 2013-05-14T10:59:37.697 回答