将一个线程放入一个条件为只允许一个线程进入的等待队列,目的是什么?
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()
进程恢复可能不存在的线程。
应此要求
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()
进程恢复可能不存在的线程。