互斥访问和系统调用

Met*_*est 9 c linux operating-system mutex pthreads

我知道,在Linux的互斥体作为实施futexes的楼下和futex的使用比较并交换机制.通常,为了获取锁,用户空间线程不需要进行系统调用,因为锁在用户空间中被解析.

现在我的问题是当存在高争用且许多线程试图同时锁定互斥锁时会发生什么.是否发生系统调用,以便内核决定授予互斥锁的哪个线程?特别是当线程优先级不同时?我自己这么认为.

Jas*_*son 8

只要没有争用,就不会进行系统调用.如果存在争用,则进行系统调用以将线程置于休眠队列中,然后该休眠队列将用于查找当互斥锁变为空闲时唤醒的第一个线程.此外,在系统调用中对futex的值进行调整,以便当前拥有的线程不会通过用户域"快速路径"解锁例程(它只是将futex重置为零或"解锁")但是,它会调用另一个系统来检查休眠队列,以便等待线程将锁所有权传递给.随着更多的线程竞争锁定,当然会发现争用的可能性更高,但是如果没有争用,那么就没有进行系统调用.


Arn*_*anc 5

Futexes 在回退到系统调用之前仅执行少量循环,因此在锁竞争较高的情况下,线程很有可能会回退到系统调用。