gpt4 book ai didi

c - 防止嵌套调用

转载 作者:太空狗 更新时间:2023-10-29 16:02:20 24 4
gpt4 key购买 nike

我有一个禁用中断的函数,但问题是如果我禁用它们并调用一个也禁用/启用它们的函数,它们会过早地重新启用。以下逻辑是否足以防止这种情况发生?

static volatile int IrqCounter = 0;

void EnableIRQ()
{
if(IrqCounter > 0)
{
IrqCounter--;
}

if(IrqCounter == 0)
{
__enable_irq();
}
}

void DisableIRQ()
{
if(IrqCounter == 0)
{
__disable_irq();
}

IrqCounter++;
}

最佳答案

我所知道的每个操作系统的做法都是将 IRQ 状态保存到局部变量中,然后恢复它。

显然,您的代码有 TOCTOU问题 - 如果两个线程同时运行,检查 IrqCounter > 0,如果 IrqCounter == 1,则第一个线程会将其视为 1,第二个线程将其视为 1,并且两者都会递减计数器。

我肯定会尝试安排这样的事情:

int irq_state = irq_save();

irq_disable();

... do stuff with IRQ's turned off ...

irq_restore(irq_state);

现在,您不必担心计数器可能会不同步等问题。

关于c - 防止嵌套调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14582327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com