我知道在Linux 互斥中实现 futexes ,而 futex 使用 db-swap 机制。通常,为了获取锁,用户空间线程不需要进行系统调用,因为锁在用户空间中被解析。
现在我的问题是当存在高争用且许多线程试图同时锁定互斥锁时会发生什么。是否发生系统调用,以便内核决定授予互斥锁的哪个线程?特别是当线程优先级不同时?我自己也这么认为。
答案 0 :(得分:8)
只要没有争用,就不会进行系统调用。如果存在争用,则进行系统调用以将线程置于休眠队列中,然后该休眠队列将用于查找当互斥锁变为空闲时唤醒的第一个线程。此外,在系统调用中对futex的值进行调整,以便当前拥有的线程不会通过用户域“快速路径”解锁例程(它只是将futex重置为零或“解锁”)但是,它会调用另一个系统来检查休眠队列,以便等待线程将锁所有权传递给。随着更多的线程竞争锁定,当然会发现争用的可能性更高,但是如果没有争用,那么就没有进行系统调用。
答案 1 :(得分:3)
Futexes在返回系统调用之前只执行少量循环,因此在高锁争用的情况下,线程很可能会回退到系统调用。