multithreading - 当只允许一个线程进入时,将一个线程放入一个带有条件的等待队列的目的是什么?
问题描述
应此要求
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 并在完成请求时唤醒它?
解决方案
是的,可以让单个线程等待(使用set_current_state()
and schedule()
)并稍后恢复它(使用wake_up_process
)。
但这需要编写一些代码来检查唤醒条件,并且可能缺少要唤醒的线程。
等待队列提供了现成的函数和宏,用于等待条件并稍后唤醒它,因此结果代码变得更短:单个宏wait_event_interruptible()
进程检查事件并将线程置于睡眠状态,单个宏wake_up_interruptible()
进程恢复可能不存在的线程。
推荐阅读
- html - 嵌套 HTML 结构中的 CSS 属性继承和覆盖
- java - 如何使二叉搜索树的遍历方法返回 Java 中的字符串?
- cmake - 我可以让 CMake 的 Make 生成器为“开销”命令添加 silencing-@ 吗?
- java - BigQuery 流插入错误 - 在数组之外添加重复记录
- java - 带抽屉布局的底部导航 | onBackPressed 在片段中
- excel - 将列表中的多个图像合并为 PDF
- python - 如何在 python 中以特定采样率输出 1 位音频?
- wordpress - add_rewrite_rule 在父主题中工作但不在子主题中
- mongodb - 获取特定类型的所有书籍
- adobe - AEM 新组件无法在组件列表中使用