3

我有一个带有静态和常量局部变量的函数,该函数是可重入的吗?

这是代码:

void foo(unsigned char *pucBuffer,
         int            iBytes,
         unsigned int  *puiOUT)
{
   static const long rg_uliLUT[4] = {0x00000000, 0x77073096, 0xee0e612c,
                                     0x990951ba};
   while(iBytes--)
   {
     *puiOUT = (*puiOUT >> 8) ^ rg_uliLUT[(*puiOUT & 0x03) ^ *pucBuffer++];
   }
}

提前谢谢你:D

4

1 回答 1

2

只要rg_uliLUTconst,我认为您的功能是可重入的。如果该变量没有const被修改,那么答案是否定的,但是因为它是常量,所以没有调用者能够修改另一个调用者的状态变量(任何可以更改的东西都在调用者的私有堆栈上,并且唯一的“共享”数据不能更改)。

来自古老的维基百科

在计算中,如果计算机程序或子程序可以在其执行过程中被中断,然后在其先前的调用完成执行之前再次安全地调用(“重新进入”),则它被称为可重入的。

所有函数状态对每个调用者都是私有的(在调用者堆栈上)。唯一的其他状态是不变的,所以因为调用者不能修改它,所以对于任何其他调用者来说,它看起来总是一样的,所以不会改变函数行为,例如,如果两个线程同时在函数中.

PS:如果指向的内存puiOUT在调用者之间共享,则不可重入。似乎也pucBuffer可能是char const *因为它没有被写入。

于 2013-08-06T09:45:13.843 回答