这个功能可以重入吗?

时间:2019-01-19 03:25:17

标签: c reentrancy

DNM_Manager.c

struct DNM_s
{
    uint32_t Addr;
    uint32_t SerialNum;
    uint32_t SubnetMask;
    uint16_t Tick;
    uint8_t Name[NAME_SIZE];
}DNMTemp;

pDNM DNMManager_New(void)    //reentrant?
{
    return &DNMTemp;
}

GeeksForGeeks说:要重新输入,该函数不能使用全局和静态数据。

在这种情况下,我确实使用了全局数据“ DNMTemp”。但是,DNMTemp的值不会更改,函数只会返回其地址。

2 个答案:

答案 0 :(得分:2)

是的

摘自的标签摘录:

  

如果可以在以前的调用完成之前安全地调用该子例程,则该子例程被视为可重入。

在您的情况下,由于该函数仅返回全局(静态)变量的地址(在程序启动后应保持不变),因此该函数可以重入。

IMO,可重入函数 可以访问全局和静态数据,而无需更改任何内容,因此获取可重入函数的全局变量地址并不坏。 / p>

答案 1 :(得分:1)

在考虑函数是否可重入时,该示例必须比该示例平凡一些。

pDNM DNMManager_New(void)    //reentrant?
{
    return &DNMTemp;
}

但是在程序执行过程中对DNMTemp(其地址)的引用将保持不变,因此该函数是可重入的。

但是,如果您访问任何真实数据,则不会。

uint32_t DNMManager_read(void)    //reentrant?
{
    return SerialNum;
}