10

假设我有多个线程在调用pthread_mutex_lock(). 当互斥锁可用时,第一个调用的线程是否pthread_mutex_lock()获得锁?也就是说,是否pthread_mutex_lock()按 FIFO 顺序调用?如果不是,它们的顺序是什么(如果有的话)?谢谢!

4

3 回答 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. 获取互斥体。
  2. 调整一些数据。
  3. 释放互斥锁。
  4. 转到步骤 1。

现在想象两个线程在单核 CPU 上运行此代码。应该清楚的是,FIFO 互斥体行为会导致每次上下文切换“调整一些数据”——这是最坏的结果。

当然,合理的实现通常确实对公平性有所帮助。我们不希望一个线程没有任何进展。但这很难证明 FIFO 实现是合理的!

于 2013-02-18T23:34:27.460 回答