将一个线程放入一个条件为只允许一个线程进入的等待队列,目的是什么?

What is the purpose of putting a thread on a wait queue with a condition when only one thread is allowed to enter?

应此要求

ssize_t foo_read(struct file *filp, char *buf, size_t count,loff_t *ppos)
{
    foo_dev_t * foo_dev = filp->private_data;
    if (down_interruptible(&foo_dev->sem)
        return -ERESTARTSYS;
    foo_dev->intr = 0;
    outb(DEV_FOO_READ, DEV_FOO_CONTROL_PORT);
    wait_event_interruptible(foo_dev->wait, (foo_dev->intr= =1));
    if (put_user(foo_dev->data, buf))
        return -EFAULT;
    up(&foo_dev->sem);
    return 1;
}

有了这个完成

irqreturn_t foo_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
    foo->data = inb(DEV_FOO_DATA_PORT);
    foo->intr = 1;
    wake_up_interruptible(&foo->wait);
    return 1;
}

假设 foo_dev->sem 最初是 1 那么只允许一个线程执行 down_interruptible(&foo_dev->sem) 之后的部分并且等待该信号量的线程是有意义的被放入队列中。(据我所知,使 foo_dev->sem 大于 1 将是该代码中的一个问题)。

因此,如果总是只有一个通过,foo_dev->等待队列有什么用,是否可以挂起当前线程,将其指针保存为全局 *curr 并在完成请求时将其唤醒?

是的,可以让单线程等待(使用set_current_state()schedule())并稍后恢复(使用wake_up_process)。

但这需要编写一些代码来检查唤醒条件和可能缺少要唤醒的线程。

Waitqueues 提供了现成的函数和宏来等待条件并稍后唤醒它,所以结果 code 变得很多 shorter: single宏 wait_event_interruptible() 进程检查事件并将线程置于休眠状态,单个宏 wake_up_interruptible() 进程恢复可能不存在的线程。