什么是多线程等待的`pthread_mutex_lock()`唤醒命令?

时间:2013-02-18 23:27:37

标签: c multithreading pthreads

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

3 个答案:

答案 0 :(得分:6)

  

当互斥锁可用时,调用pthread_mutex_lock()的第一个线程是否获得锁定?

没有。其中一个等待的线程获得了一个锁定,但是哪个获取它是不确定的。

  

FIFO订单?

FIFO互斥体已经是一种模式。见Implementing a FIFO mutex in pthreads

答案 1 :(得分:1)

FIFO排序是关于可能的最低效的互斥唤醒命令。只有真正糟糕的实现才会使用它。最近运行的线程可以在没有上下文切换的情况下再次运行,并且最近一个线程运行,其更多的数据和代码将在缓存中变热。合理的实现尝试将互斥锁提供给最近最多持有它的线程。

考虑两个执行此操作的线程:

  1. 获取互斥锁。
  2. 调整一些数据。
  3. 释放互斥锁。
  4. 转到第1步。
  5. 现在想象两个线程在单核CPU上运行此代码。应该清楚的是,FIFO互斥行为会导致每个上下文切换“调整一些数据” - 最糟糕的结果。

    当然,合理的实施通常会给予一些公平的点头。我们不希望一个线程没有前进的进展。但这很难说明FIFO的实施!

答案 2 :(得分:1)

“如果在调用pthread_mutex_unlock()时互斥引用的互斥锁对象上存在线程阻塞,导致互斥锁变为可用,则调度策略将确定哪个线程将获取互斥锁。”

除此之外,POSIX标准未指定您的问题的答案。它可以是随机的,也可以是FIFO或LIFO或任何其他顺序,根据实现的选择。