如何解决C:锁定pthread互斥锁是否会将线程放置在FIFO队列中?
让我们说线程1 已锁定mutex
并完成了一些工作。
如果线程2 调用:
pthread_mutex_lock(&mutex);
然后线程3 调用相同的内容:
pthread_mutex_lock(&mutex);
然后线程1 解锁mutex
。 FIFO(先进先出)是否适用于试图锁定mutex
的线程?
如果是这样,线程2 将保证是下一个获得mutex
的线程。
解决方法
FIFO(先进先出)是否适用于试图锁定互斥锁的线程?
不是,不能保证FIFO。
请参见https://man7.org/linux/man-pages/man3/pthread_mutex_lock.3p.html:
如果有线程 在互斥对象引用的互斥对象上被阻止时
pthread_mutex_unlock()
被调用,导致互斥锁变为 在可用的情况下,调度策略将确定哪个线程应 获取互斥锁。
在Linux上,pthread互斥锁是使用futex实现的,而pthread_mutex_unlock()
涉及FUTEX_WAKE
:
,无法保证唤醒哪些侍者(例如, 不能保证安排更高优先级的服务员 优先于优先级较低的服务生被唤醒。
这确实取决于当前的调度策略。如果是SCHED_FIFO,那么对于每个优先级,确实有一个fifo服务员列表,并且确实有futex允许这样做(请参见futexes,FUTEX_LOCK_PI节)。 SCHED_FIFO往往是用于实时应用程序的策略。上的页面
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。