【问题标题】:Is wait_for_completion_timeout 100% fair?wait_for_completion_timeout 100% 公平吗?
【发布时间】:2016-06-17 21:07:40
【问题描述】:

是否 100% 保证最先到达 wait_for_completion_timeout 的线程会在调用完成时首先唤醒? 也许我错了,但我看以下场景: 线程 A 调用 wait_for_completion_timeout 并进入睡眠状态。当调用完成时,它会唤醒并完成函数 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 先开始等待。

谁能告诉我我错过了什么?

【问题讨论】:

    标签: multithreading linux-kernel


    【解决方案1】:

    你没有错过任何东西。线程不是在打仗,它们合作以取得进步。严格公平需要付出巨大的代价,而且由于几乎从不需要它,因此在一般情况下没有理由支付这笔费用。

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

    【讨论】:

    • 在这种情况下,函数完成的以下注释有点错误:“这将唤醒等待此完成的单个线程。线程将按照它们排队的顺序被唤醒。”虽然从技术上讲,线程 B 并没有真正进入睡眠状态,但从用户的角度来看,使用 wait_for_completion_timeout 的线程 B 应该在线程 A 唤醒后唤醒。
    • 线程唤醒的顺序并不能保证它们继续前进的顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多