【问题标题】:Possible deadlock situation: interrupt and mutex可能的死锁情况:中断和互斥锁
【发布时间】:2013-06-29 13:08:48
【问题描述】:

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

【问题讨论】:

    标签: c++ mutex deadlock


    【解决方案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 ;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 2018-06-10
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      相关资源
      最近更新 更多