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类型,则该函数似乎可以异步重入(但仍然不是线程安全的)。

10-08 18:36