首页 > 解决方案 > 当只允许一个线程进入时,将一个线程放入一个带有条件的等待队列的目的是什么?

问题描述

应此要求

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大于一将是该代码中的问题)。

因此,如果始终只有一个通过 foo_dev->wait 队列的用途,是否可以暂停当前线程,将其指针保存为全局 *curr 并在完成请求时唤醒它?

标签: multithreadinglinux-kernellinux-device-drivermultitasking

解决方案


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

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

等待队列提供了现成的函数和宏,用于等待条件并稍后唤醒它,因此结果代码变得更:单个宏wait_event_interruptible()进程检查事件并将线程置于睡眠状态,单个宏wake_up_interruptible()进程恢复可能不存在的线程。


推荐阅读