内核等待队列如何解决"lost wake up"?
How do kernel wait queues solve "lost wake up"?
我读了 Linux 内核开发 一书,对睡眠和唤醒部分给出的示例有一些疑问。
DEFINE_WAIT(wait);
add_wait_queue(q, &wait);
while (!condition) {
prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);
if (signal_pending(current))
/* handle signal */
schedule();
}
finish_wait(&q, &wait);
如果 wake_up 出现在 prepare_to_wait()
之前和 while 条件之后会发生什么? wake_up
会丢失吗?
是的,唤醒会丢失。
prepare_to_wait()
必须在 之前调用 检查条件。
(这是您将在实际代码中看到的内容。)
我读了 Linux 内核开发 一书,对睡眠和唤醒部分给出的示例有一些疑问。
DEFINE_WAIT(wait);
add_wait_queue(q, &wait);
while (!condition) {
prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);
if (signal_pending(current))
/* handle signal */
schedule();
}
finish_wait(&q, &wait);
如果 wake_up 出现在 prepare_to_wait()
之前和 while 条件之后会发生什么? wake_up
会丢失吗?
是的,唤醒会丢失。
prepare_to_wait()
必须在 之前调用 检查条件。
(这是您将在实际代码中看到的内容。)