什么是multithreading等待的`pthread_mutex_lock()`唤醒命令?

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

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

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

FIFO订单?

FIFO互斥体已经是一种模式。 请参阅在pthreads中实现FIFO互斥锁

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

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

  1. 获取互斥锁。
  2. 调整一些数据。
  3. 释放互斥锁。
  4. 转到第1步。

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

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

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

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