可能的死锁情况:中断和互斥

时间:2013-06-29 13:08:48

标签: c++ mutex deadlock

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

wiringPi中的中断服务程序非阻塞,不会阻止程序的其余部分执行。安装ISR时,wirePi启动一个单独的轮询线程,调用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 ;
}