是否100%保证首先获得wait_for_completion_timeout的线程在调用完成时会先唤醒?
也许我错了,但我看下面的场景:
线程A调用wait_for_completion_timeout并进入休眠状态。当调用complete时,它会唤醒并在函数do_wait_for_common中完成timeout = action(timeout);
的执行。
现在让我们说另一个线程B调用wait_for_completion_timeout。现在x-> done为1,因此该线程将x-> done设置为0并继续执行。现在线程A继续执行,它转到下一行:
} while (!x->done && timeout);
然后回去睡觉。 所以线程B首先被执行,尽管线程A开始先等待。
有人可以告诉我,我错过了什么?
答案 0 :(得分:2)
你没有遗漏任何东西。线程不在战争中,它们合作以推进进步。严格公平的成本很高,而且几乎从不需要,因此在一般情况下没有理由支付这笔费用。
运行最近运行的线程通常最有效,因为它的大部分数据可能仍在缓存中。因此,每个线程都会受益于“不公平”#34;政策。