待機キューの一般的な使用例は、割り込みです。おそらく、カーネル ドライバーは現在 3 つの異なる条件で待機しており、それぞれが割り込みで起動されます。
これにより、カーネル割り込みハンドラーがすべてのリスナーを起動するだけで済み、特定の条件が発生したかどうか、または起動する必要があるかどうかをリスナー間で判断できます。
また、割り込みが共有される可能性があり、割り込みが遅延および合体されるため、偽の割り込みが発生する可能性があります。
いくつかのコードを追加し、より明示的にしようとしないもの。
以下に、カーネル ドライバーの一部である可能性のあるコードをいくつか書きました。割り込みハンドラーは、単純にすべてのリスナーを起動します。ただし、実際にはすべてのリスナーが完了するわけではありません。どちらも同じ割り込みによって起こされますが、続行する前に特定の条件が満たされているかどうかを確認します。
// Registered interrupt handler
static irqreturn_t interrupt_handler(void *private) {
struct device_handle *handle = private;
wake_up_all(&handle->wait);
}
// Some Kernel Thread
void program_a(struct device_handle * handle) {
wait_event_interruptible(&handle->wait, hardware_register & 0x1);
printk("program_a finished\n");
}
// Some other kernel thread
void program_b(struct device_handle * handle) {
wait_event_interruptible(&handle->wait, hardware_register & 0x2);
printk("program_b finished\n");
}