0

私はこの C++ プログラムを持っていますが、これは最終的に 2 つのスレッドでバラバラになります。1 つのスレッドが割り込みを待機し、割り込みが発生した場合はカウンターをインクリメントします。

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

今、私は非常に興味があります: 割り込みが発生した瞬間にミューテックスが 2 番目のスレッドによってロックされていたらどうなるでしょうか。割り込みはどのくらい深くなりますか?reactInterrupt() コードを終了しようとしている間、すべてを完全にロックしますか? その場合、CPU がミューテックスのロックが解除されるのを無防備に待機する (非常にまれな) デッドロック状況が発生するためです。それとも、割り込みは単にメソッドの実行をスケジュールするだけですか?これは、メソッドが CPU の実行リストに追加されていることを意味するだけでしょうか? その場合、メソッドはミューテックスが解放されるのを待つだけで済みます。これははるかに優れていると思います。

4

1 に答える 1

1

ワイヤリングPi の割り込みサービス ルーチンはノンブロッキングあり、プログラムの残りの部分の実行を妨げることはありません。ISR ワイヤリングをインストールすると、Pi は別のポーリング スレッドを開始waitForInterruptし、IRQ ラインがトリガーされるのを待つために呼び出します。IRQ がトリガーされると、ポーリング スレッドのコンテキストで提供されたサービス ルーチンが呼び出されます。

配線Pi.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 に答える