假设我有多个线程在调用pthread_mutex_lock()
. 当互斥锁可用时,第一个调用的线程是否pthread_mutex_lock()
获得锁?也就是说,是否pthread_mutex_lock()
按 FIFO 顺序调用?如果不是,它们的顺序是什么(如果有的话)?谢谢!
问问题
7789 次
3 回答
6
当互斥锁可用时,第一个调用的线程是否
pthread_mutex_lock()
获得锁?
不会。其中一个等待线程获得了锁,但不确定是哪一个获得了锁。
先进先出顺序?
FIFO 互斥体已经是一种模式。请参阅在 pthreads 中实现 FIFO 互斥锁
于 2013-02-18T23:30:53.840 回答
2
“如果调用 pthread_mutex_unlock() 时 mutex 引用的 mutex 对象上有线程阻塞,导致 mutex 可用,则调度策略应确定哪个线程应获取 mutex。”
除此之外,POSIX 标准并未指定您的问题的答案。它可能是随机的,也可能是 FIFO 或 LIFO 或任何其他顺序,这取决于实现所做的选择。
于 2013-02-18T23:37:47.917 回答
0
FIFO 排序可能是效率最低的互斥唤醒顺序。只有真正糟糕的实现才会使用它。最近运行的线程可能能够在没有上下文切换的情况下再次运行,并且最近运行的线程,其更多的数据和代码将在缓存中处于热状态。合理的实现会尝试将互斥锁提供给大多数时间最近持有它的线程。
考虑两个执行此操作的线程:
- 获取互斥体。
- 调整一些数据。
- 释放互斥锁。
- 转到步骤 1。
现在想象两个线程在单核 CPU 上运行此代码。应该清楚的是,FIFO 互斥体行为会导致每次上下文切换“调整一些数据”——这是最坏的结果。
当然,合理的实现通常确实对公平性有所帮助。我们不希望一个线程没有任何进展。但这很难证明 FIFO 实现是合理的!
于 2013-02-18T23:34:27.460 回答