假设我在调用pthread_mutex_lock()
时有多个线程阻塞。当互斥锁变得可用时,调用pthread_mutex_lock()
的第一个线程是否获得锁定?也就是说,是按FIFO顺序调用pthread_mutex_lock()
?如果不是,那么它们的订单是什么?谢谢!
答案 0 :(得分:6)
当互斥锁可用时,调用
pthread_mutex_lock()
的第一个线程是否获得锁定?
没有。其中一个等待的线程获得了一个锁定,但是哪个获取它是不确定的。
FIFO订单?
FIFO互斥体已经是一种模式。见Implementing a FIFO mutex in pthreads
答案 1 :(得分:1)
FIFO排序是关于可能的最低效的互斥唤醒命令。只有真正糟糕的实现才会使用它。最近运行的线程可以在没有上下文切换的情况下再次运行,并且最近一个线程运行,其更多的数据和代码将在缓存中变热。合理的实现尝试将互斥锁提供给最近最多持有它的线程。
考虑两个执行此操作的线程:
现在想象两个线程在单核CPU上运行此代码。应该清楚的是,FIFO互斥行为会导致每个上下文切换“调整一些数据” - 最糟糕的结果。
当然,合理的实施通常会给予一些公平的点头。我们不希望一个线程没有前进的进展。但这很难说明FIFO的实施!
答案 2 :(得分:1)
“如果在调用pthread_mutex_unlock()时互斥引用的互斥锁对象上存在线程阻塞,导致互斥锁变为可用,则调度策略将确定哪个线程将获取互斥锁。”
除此之外,POSIX标准未指定您的问题的答案。它可以是随机的,也可以是FIFO或LIFO或任何其他顺序,根据实现的选择。