Функция с постоянной и статической локальной переменной, делает функцию реентерабельной?
У меня есть функция с локальной переменной, которая является статической и постоянной, функция реентерабельна?
Это код:
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++];
}
}
Заранее благодарю
1 ответ
Пока rg_uliLUT
является const
тогда да, я думаю, что твоя функция повторная. Если бы эта переменная не была const
и был изменен, тогда ответ был бы отрицательным, но поскольку он постоянен, ни один вызывающий не сможет изменить переменные состояния другого вызывающего (все, что можно изменить, находится в личном стеке вызывающего, и единственные "общие" данные не могут быть изменены),
Из старой доброй википедии
В вычислениях компьютерная программа или подпрограмма называется reentrant, если она может быть прервана в середине своего выполнения, а затем безопасно вызвана снова ("повторно введена") до полного выполнения предыдущего вызова.
Все состояние функции является приватным для каждого вызывающего (в стеке вызывающего). Единственное другое состояние является константой, так как вызывающая сторона не может изменить его, для любой другой вызывающей стороны она всегда будет выглядеть одинаково, поэтому не изменит поведение функции, если, например, два потока находятся в функции одновременно,
PS: Это не повторный вход, если память, на которую указывает puiOUT
распределяется между абонентами Также кажется, что pucBuffer
может быть char const *
потому что это не написано.