免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3408 | 回复: 6
打印 上一主题 下一主题

wait_event的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-18 18:34 |只看该作者 |倒序浏览
#define __wait_event(wq, condition)                                         \
do {                                                                        \
        DEFINE_WAIT(__wait);                                                \
                                                                        \
        for ( ; ; ) {                                                        \
                prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE);        \
                if (condition)                                                \
                        break;                                                \
                schedule();                                                \
        }                                                                \
        finish_wait(&wq, &__wait);                                        \
} while (0)

为什么wait_event里面要用for( ; ; )无限循环?进程被设为TASK_UNINTERRUPTIBLE后不就不再被调度,上CPU了么?
是不是因为别的进程唤醒他时,可能condition条件还没有被满足?

论坛徽章:
0
2 [报告]
发表于 2008-10-19 00:38 |只看该作者
对,是这个原因。
假设在for循环的schedule()中,因为别的进程唤醒它而从schedule()返回,那么就回到for循环的开始处,
经过prepare_to_wait(),然后来判断condition条件是否满足,如果满足就finsh_wait()结束

论坛徽章:
0
3 [报告]
发表于 2008-10-20 17:25 |只看该作者
问一个额外的问题:
TASK_UNINTERRUPTIBLE状态的线程不是不能被信号唤醒吗?怎么被“别的进程唤醒”?

原帖由 kissGNU 于 2008-10-19 00:38 发表
对,是这个原因。
假设在for循环的schedule()中,因为别的进程唤醒它而从schedule()返回,那么就回到for循环的开始处,
经过prepare_to_wait(),然后来判断condition条件是否满足,如果满足就finsh_wait()结束

论坛徽章:
0
4 [报告]
发表于 2008-10-21 09:36 |只看该作者
原帖由 freearth 于 2008-10-20 17:25 发表
问一个额外的问题:
TASK_UNINTERRUPTIBLE状态的线程不是不能被信号唤醒吗?怎么被“别的进程唤醒”?



当等待的条件等到时被唤醒
不可被信号打断.

论坛徽章:
0
5 [报告]
发表于 2008-10-21 14:31 |只看该作者
我的理解是如果有两个以上进程在同时Wait时,当等待的条件到,两个进程都会唤醒。
这个时候,如果其中一个进程修改了条件,那么另外一个进程就会因为条件不成立,需要继续等待。
就要用循环。

论坛徽章:
0
6 [报告]
发表于 2008-10-21 14:47 |只看该作者
TASK_UNINTERRUPTIBLE进程
可以被wakeup, 不能因为信号被唤醒

原帖由 freearth 于 2008-10-20 17:25 发表
问一个额外的问题:
TASK_UNINTERRUPTIBLE状态的线程不是不能被信号唤醒吗?怎么被“别的进程唤醒”?

论坛徽章:
0
7 [报告]
发表于 2008-10-22 15:40 |只看该作者
别的进程通过wq 可以唤醒本进程
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP