互斥访问和系统调用

12

我知道在Linux中,mutex是通过底层的futex来实现的,并且futex使用了compare-and-swap机制。通常情况下,为了获取锁,用户空间线程不需要进行系统调用,因为锁是在用户空间解决的。

那么当有很多线程同时尝试锁定一个mutex时会发生什么呢?当线程的优先级不同时,是否会出现系统调用以便内核决定授予哪个线程mutex呢?我认为是这样。

2个回答

11
只要没有争用,就不会进行系统调用。如果有争用,则会进行系统调用,将线程放入睡眠队列中,以便在互斥锁变为可用时找到第一个要唤醒的线程。此外,在系统调用中对futex的值进行调整,以便当前持有线程不会通过用户空间的“快速解锁路径”(该路径只是将futex重置为零或“未锁定值”)而是进行另一次系统调用,检查等待线程的睡眠队列以传递锁所有权。当有更多的线程竞争锁时,当然会更容易发现争用,但是如果没有争用,那么就不会进行系统调用。

5

Futexes只在少数循环后就会回退到系统调用,因此在高锁竞争的情况下,线程很有可能会回退到系统调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接