0

我有这个 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 必须做的事情列表中?在这种情况下,该方法只会等待互斥锁变得空闲,我认为这会更好。

4

1 回答 1

1

WiringPi 中的中断服务例程是非阻塞的,不会阻止程序的其余部分执行。当您安装 ISR 接线时,Pi 会启动一个单独的轮询线程,该线程调用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 ;
}
于 2013-06-29T14:37:04.070 回答