这个函数是可重入的吗?
Is this function re-entrant?
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 的值没有改变,并且只发挥作用 return 它的地址。
是的。
来自 reentrancy 的标签摘录:
A subroutine is considered reentrant if it can be safely called before a previous call has completed.
在你的例子中,由于该函数只是 returns 全局(静态)变量的地址,该变量在程序启动后应保持不变,因此该函数可以很好地重入。
IMO,可重入函数可以访问全局和静态数据,无需更改任何,因此获取全局变量的地址是'对可重入函数来说很不错。
在考虑函数是否可重入时,这个例子必须比这个例子简单一点。
pDNM DNMManager_New(void) //reentrant?
{
return &DNMTemp;
}
但是对DNMTemp
(它的地址)的引用在程序执行期间将保持不变,所以这个函数是可重入的。
但是如果您访问任何真实数据,它不会。
uint32_t DNMManager_read(void) //reentrant?
{
return SerialNum;
}
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 的值没有改变,并且只发挥作用 return 它的地址。
是的。
来自 reentrancy 的标签摘录:
A subroutine is considered reentrant if it can be safely called before a previous call has completed.
在你的例子中,由于该函数只是 returns 全局(静态)变量的地址,该变量在程序启动后应保持不变,因此该函数可以很好地重入。
IMO,可重入函数可以访问全局和静态数据,无需更改任何,因此获取全局变量的地址是'对可重入函数来说很不错。
在考虑函数是否可重入时,这个例子必须比这个例子简单一点。
pDNM DNMManager_New(void) //reentrant?
{
return &DNMTemp;
}
但是对DNMTemp
(它的地址)的引用在程序执行期间将保持不变,所以这个函数是可重入的。
但是如果您访问任何真实数据,它不会。
uint32_t DNMManager_read(void) //reentrant?
{
return SerialNum;
}