在wait_event()实施,内核确实是这样的:
...
prepare_to_wait(); /* enqueue current thread to the wait queue */
...
schedule(); /* invoke deactivate_task() inside, which will dequeue current thread from the runqueue */
...
在 “WAKE_UP()” 的实施,内核做了如下:
...
try_to_wake_up(); /* invoke activate_task() inside, which will enqueue the target thread into the runqueue */
... 在并发
执行,如果按以下顺序调用上述功能会怎么样:
...
prepare_to_wait(); /* thread A adds itself to the wait queue */
...
try_to_wake_up(); /* thread B wakes up A and enqueues it into the runqueue */
...
schedule(); /* thread A dequeues itself from the runqueue and yields the CPU */
...
线程A不在runqueue或等待队列中。这是否意味着我们失去了线程A?内核必须有一些机制来防止这种情况发生。有人能告诉我我在这里错过了什么吗?谢谢!
2013-09-23
brian