内核等待队列如何解决"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() 必须在 之前调用 检查条件。 (这是您将在实际代码中看到的内容。)