具有常数和功能的功能静态局部变量,使函数可重入?

时间:2013-08-06 09:37:50

标签: c variables static const reentrancy

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

这是代码:

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

1 个答案:

答案 0 :(得分:2)

只要rg_uliLUTconst然后是,我认为您的功能是可重入的。如果该变量不是const并且被修改了,那么答案就是否定,但因为它是常量,所以没有调用者能够修改另一个调用者的状态变量(任何可以更改的内容都在呼叫者的私人堆栈和唯一的"共享"数据无法更改。

从古老的wikipedia

开始
  

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

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

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