Skip to main content
 首页 » 编程设计

linux-kernel之为什么等待队列实现在循环中等待直到条件满足

2024年12月31日23tuyile006

让我们考虑一个单处理器场景。
wait_event_interruptible() (或其他等待 API)在循环中等待,直到满足某个条件。

现在,由于 linux 将线程实现为单独的进程,我相信错误唤醒(在不满足条件的情况下唤醒 wait_event*)表明程序/驱动程序中存在错误。

我错了吗? - 是否有任何有效的场景可以发生并使用这种虚假唤醒?换句话说,为什么要等待 中的条件循环 wait_event*执行?

请您参考如下方法:

等待队列的一个常见用例是中断。也许您的内核驱动程序当前正在等待三种不同的条件,每一种都会被中断唤醒。

这允许您的内核中断处理程序唤醒所有监听器,然后他们可以确定他们的特定条件是否已经发生,或者他们是否应该唤醒。

此外,您可能会收到虚假中断,因为可以共享中断以及延迟和合并中断。

添加一些代码以及不尝试更明确的内容。

我在下面编写了一些代码,它们可能是内核驱动程序的一部分。中断处理程序只是将唤醒所有监听器。然而,并不是所有的监听器都可以真正做到。两者都会被同一个中断唤醒,但在继续之前,它们都会查看它们的特定条件是否已完成。

// 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"); 
}