2013-06-29 54 views
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必須做的事情列表中?在這種情況下,這個方法只會等待互斥體變得自由,我認爲這會更好。

回答

1

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 ; 
}