我有一个带静态和局部变量的函数。常量,函数是否可重入?
这是代码:
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
答案 0 :(得分:2)
只要rg_uliLUT
是const
然后是,我认为您的功能是可重入的。如果该变量不是const
并且被修改了,那么答案就是否定,但因为它是常量,所以没有调用者能够修改另一个调用者的状态变量(任何可以更改的内容都在呼叫者的私人堆栈和唯一的"共享"数据无法更改。
从古老的wikipedia
开始在计算中,如果计算机程序或子程序被称为可重入的 它可以在执行过程中被中断,然后安全地中断 在之前的调用完成之前再次调用("重新输入") 执行。
所有函数状态对每个调用者都是私有的(在调用者堆栈上)。唯一的其他状态是常量,所以因为调用者无法修改它,所以对于任何其他调用者来说它总是看起来一样,所以如果函数中有两个线程,则不会改变函数行为在同一时间。
PS:如果puiOUT
指向的内存在呼叫者之间共享,则不可重入。似乎pucBuffer
可能是char const *
,因为它不会被写入。