1

在 POSIX 互斥协议的文档中 - http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getprotocol.html# - 我们可以阅读以下部分:

当线程持有已使用 PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT 协议属性初始化的互斥锁时,如果其原始优先级发生更改,则不应将其移动到调度队列的尾部,例如通过调用 sched_setparam()。同样,当线程解锁已使用 PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT 协议属性初始化的互斥锁时,如果其原始优先级发生更改,则不应将其移动到其优先级的调度队列的尾部。

这可能是对这个片段的引用:

如果一个线程的策略或优先级已经被 pthread_setschedprio() 修改,它是一个正在运行的线程或者是可运行的,那么它就成为新优先级的线程列表的尾部。

(来源 - http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_08,SCHED_FIFO描述)

英语不是我的第一语言,所以我很难理解它到底在说什么......

这是否意味着当线程的优先级被提升时(由于继承或上限协议),它不是放在新优先级的尾部,而是放在头部?或者这可能描述了由于该线程本身或另一个线程调用 sched_setparam() (或类似函数)而导致优先级更改的情况?也许这只是对事实的一个奇怪描述,即这样的线程以从互斥体继承的优先级执行,因此对其原始优先级的任何更改都没有任何区别?

我尝试搜索对此行为的不同描述,但所有规范都只是原始规范的副本,其中一些使用略有不同的词,但这根本没有区别。

有任何想法吗?

4

1 回答 1

2

文字不容易解开……

...但我同意你的看法,一般规则是线程的策略/优先级更改会导致它被放在相关优先级队列的后面,除非更改是由pthread_setschedprio()...

...然后有该规则的例外情况。

...所以,当一个 pthread 持有一个互斥体并且它的优先级被改变以避免优先级反转时,那么线程被移动到其优先级队列的后面似乎是合理的。

...不是那么明显,这意味着什么:

同样,当线程解锁已使用 PTHREAD_PRIO_INHERIT 或 PTHREAD_PRIO_PROTECT 协议属性初始化的互斥锁时,如果其原始优先级发生更改,则不应将其移动到其优先级的调度队列的尾部。

...我认为这里的关键是“原创”这个词。我认为这意味着如果线程的实际优先级已更改(通过某些调度函数显式更改)但线程仍在继续运行,则无需担心以后的互斥锁解锁。我认为这是为了提高效率......互斥代码必须担心自己的优先级问题,而不是其他任何问题。

于 2014-09-18T21:51:15.913 回答