【问题标题】:C: Does locking a pthread mutex place the thread in a FIFO queue?C: 锁定 pthread 互斥体是否会将线程置于 FIFO 队列中?
【发布时间】:2020-08-19 11:15:42
【问题描述】:

假设 线程 1 已锁定 mutex 并做了一些工作。

如果 线程 2 调用:

pthread_mutex_lock(&mutex);

然后线程3调用同样的:

pthread_mutex_lock(&mutex);

然后线程1解锁mutex。 FIFO(先进先出)是否适用于试图锁定mutex的线程?

如果是这样,线程 2 肯定是下一个获得mutex 的线程。

【问题讨论】:

    标签: c multithreading pthreads mutex


    【解决方案1】:

    FIFO(先进先出)是否适用于试图锁定互斥锁的线程?

    不,不保证 FIFO。

    https://man7.org/linux/man-pages/man3/pthread_mutex_lock.3p.html:

    如果有线程 在 mutex 引用的 mutex 对象上阻塞时 pthread_mutex_unlock() 被调用,导致互斥体变为 可用,调度策略应确定哪个线程应 获取互斥体。

    在 Linux 上 pthread 互斥锁是使用 futex 实现的,pthread_mutex_unlock() 涉及到 FUTEX_WAKE

    无法保证唤醒哪些服务员(例如, 不能保证具有更高调度优先级的服务员 优先于优先级较低的服务员被唤醒)。

    【讨论】:

      【解决方案2】:

      这确实取决于现行的调度策略。如果是 SCHED_FIFO,那么对于每个优先级,确实有一个等待者的 fifo 列表,而且 futex 确实允许这样做(参见futexes,FUTEX_LOCK_PI 部分)。 SCHED_FIFO 往往是用于实时应用程序的策略。页面上

      【讨论】:

      • 优先级反转保护的互斥锁提高了锁定互斥锁的线程的优先级,这正是FUTEX_LOCK_PI所做的。
      猜你喜欢
      • 2011-07-20
      • 1970-01-01
      • 2013-06-06
      • 2011-05-20
      • 1970-01-01
      • 2013-08-31
      • 2011-07-24
      • 2012-12-25
      相关资源
      最近更新 更多