【问题标题】:Mutexes and thread priorities with regards to scheduling on POSIX systems与 POSIX 系统上的调度有关的互斥锁和线程优先级
【发布时间】:2012-04-30 09:02:59
【问题描述】:

在 POSIX 系统(linux 等)中,当多个线程锁定一个公共互斥体时 - 是 始终 观察到的锁定顺序,还是线程优先级偏向在临界区调度下一个线程时优先级更高?

标准是否提到了有关行为的任何内容?因为据我所知,它似乎只提到了所需的接口。

请注意,我正在寻找任何符合 POSIX 的系统(不仅仅是 linux)的指导,因此请随意建议其他操作系统(QNX、Minix 等)的行为。

【问题讨论】:

  • 使用的系统调用称为 futex(2)(至少在 linux 上)
  • 据我所知,每当我们试图锁定一个互斥锁或一个信号量并且不成功时,这些进程都会被发送到一个队列中。每个信号量/互斥量都有一个队列。一旦信号量变量出现增量,就会检查队列并根据 FIFO 算法(Source Galvin)调用一个新进程。因此,理想情况下,答案应该是锁定顺序,但不是 100% 确定。

标签: c pthreads posix mutex thread-priority


【解决方案1】:

当多个线程等待锁定同一个互斥体时,当互斥体可用时,优先级最高的线程将首先解锁。如果多个线程具有相同的优先级,则解锁哪个线程将取决于使用的调度算法,例如使用先进先出策略,等待时间最长的线程将首先被唤醒。

线程优先级和同步是一个相当棘手的领域,您需要非常小心,以免导致优先级倒置并导致死锁。

Butenhof 的使用 POSIX 线程编程第 5.5 章处理实时调度。

【讨论】:

  • 那你说的是完全基于FIFO排序,和优先级无关?
  • 不,我是说线程优先级是首要因素,如果多个线程具有相同的优先级,调度算法决定唤醒哪个线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多