Multithreading 等待完成超时是否100%公平?

Multithreading 等待完成超时是否100%公平?,multithreading,linux-kernel,Multithreading,Linux Kernel,是否100%保证了在调用complete时首先等待\u完成\u超时的线程会首先唤醒? 也许我错了,但我看到了以下情况: 线程A调用等待完成超时并进入睡眠状态。当调用complete时,它会唤醒并完成timeout=action(timeout)的执行在函数中不等待公用。 现在让我们假设另一个线程B调用等待完成超时。现在x->done是1,所以这个线程将x->done设置为0并继续执行。现在线程A继续执行,它转到下一行: } while (!x->done && timeou

是否100%保证了在调用complete时首先等待\u完成\u超时的线程会首先唤醒? 也许我错了,但我看到了以下情况: 线程A调用等待完成超时并进入睡眠状态。当调用complete时,它会唤醒并完成
timeout=action(timeout)的执行在函数中不等待公用。
现在让我们假设另一个线程B调用等待完成超时。现在x->done是1,所以这个线程将x->done设置为0并继续执行。现在线程A继续执行,它转到下一行:

} while (!x->done && timeout);
然后继续睡觉。 所以线程B首先执行,尽管线程A首先开始等待


有人能告诉我我错过了什么吗

你没有遗漏任何东西。线程不是处于战争状态,而是通过合作来取得进展。严格公平的代价是巨大的,而且因为它几乎从来都不需要,所以在一般情况下没有理由支付这种代价


运行最近运行的线程通常是最有效的,因为它的大部分数据可能仍在缓存中。因此,每个线程都会从“不公平”策略中受益。

在这种情况下,函数complete的以下注释有点错误:“这将唤醒等待此完成的单个线程。线程将按照它们排队的相同顺序被唤醒。”虽然从技术上讲线程B没有进入实际睡眠状态,从用户的角度来看,使用wait_for_completion_timeout线程B的用户应该在线程A唤醒后唤醒。线程唤醒的顺序并不保证它们将继续前进的顺序。