让我们考虑一个单处理器场景。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");
}