gpt4 book ai didi

c++ - 可能的死锁情况 : interrupt and mutex

转载 作者:行者123 更新时间:2023-11-28 07:32:35 26 4
gpt4 key购买 nike

我有这个 C++ 程序,它最终在两个线程中分崩离析。一个线程等待中断,如果中断发生,它会增加一个计数器:

void reactInterrupt(){
counter_lock.lock();
std::cout<< ++counter;
counter_lock.unlock();
}

中断码来自wiringPi还有 seconds 线程,它会休眠 x 秒,当它醒来时,它会执行以下操作:

//blaaah
int coutercopy;
counter_lock.lock();
countercopy = counter;
counter = 0;
counter_lock.unlock();
//more blaah

现在我非常好奇:如果互斥锁在中断发生的那一刻被第二个线程锁定,会发生什么情况。中断有多深?它在尝试完成 reactInterrupt() 代码时是否完全锁定所有内容?因为如果是这种情况,我会看到一个(极其罕见的)死锁情况,CPU 会无限期地等待互斥体解锁。或者中断只是安排执行方法,这只意味着方法被添加到 CPU 必须做的事情列表中?在那种情况下,该方法将只等待互斥量释放,我认为这要好得多。

最佳答案

wiringPi 中的中断服务例程是非阻塞,不会阻止程序其余部分的执行。当您安装 ISR 时,wiringPi 会启动一个单独的轮询线程,该线程调用 waitForInterrupt 以等待 IRQ 线触发。触发 IRQ 时,它会在轮询线程的上下文中调用提供的服务例程。

来自 wiringPi.c

static void *interruptHandler (void *arg)
{
int myPin ;

(void)piHiPri (55) ; // Only effective if we run as root

myPin = pinPass ;
pinPass = -1 ;

for (;;)
if (waitForInterrupt (myPin, -1) > 0)
isrFunctions [myPin] () ;

return NULL ;
}

关于c++ - 可能的死锁情况 : interrupt and mutex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17380544/

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