https://en.wikipedia.org/wiki/Reentrancy_(computing)(截至2016年12月9日)指出,尽管修改了全局变量,但以下代码仍可重入,因为swap
使其保持不变:
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
}
但是,如果
swap
在其他任何地方被打断怎么办?根据术语的定义,该函数是否可重入?顺便说一句,本文被引用为SO其他地方的资料-也许有人应该对其进行改进。
最佳答案
要回答这个问题,有必要观察到“可重入”是一个过载的术语,具有几种公认的含义,其中一些含义从“拉伸(stretch)”到“公然不正确”。
我会说该函数是同步(但不是异步)可重入的,并且肯定不是线程安全的。这在这里相当空虚,因为它不调用任何其他函数,但是如果它调用了一个回调函数,然后可以回调该函数,则这将是有意义的。
如果正确使用了volatile
类型,则该函数似乎可以异步重入(但仍然不是线程安全的)。