Chinaunix

标题: wait_event的疑问 [打印本页]

作者: fishswimming    时间: 2008-10-18 18:34
标题: wait_event的疑问
#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条件还没有被满足?
作者: kissGNU    时间: 2008-10-19 00:38
对,是这个原因。
假设在for循环的schedule()中,因为别的进程唤醒它而从schedule()返回,那么就回到for循环的开始处,
经过prepare_to_wait(),然后来判断condition条件是否满足,如果满足就finsh_wait()结束
作者: freearth    时间: 2008-10-20 17:25
问一个额外的问题:
TASK_UNINTERRUPTIBLE状态的线程不是不能被信号唤醒吗?怎么被“别的进程唤醒”?

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

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



当等待的条件等到时被唤醒
不可被信号打断.
作者: lfwalkman    时间: 2008-10-21 14:31
我的理解是如果有两个以上进程在同时Wait时,当等待的条件到,两个进程都会唤醒。
这个时候,如果其中一个进程修改了条件,那么另外一个进程就会因为条件不成立,需要继续等待。
就要用循环。
作者: kissGNU    时间: 2008-10-21 14:47
TASK_UNINTERRUPTIBLE进程
可以被wakeup, 不能因为信号被唤醒

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


作者: lfwalkman    时间: 2008-10-22 15:40
别的进程通过wq 可以唤醒本进程




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2