在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()(或类似函数)而导致优先级更改的情况?也许这只是一个奇怪的事实描述,这样的线程以从互斥体继承的优先级执行,所以不改变它的原始优先级会有什么不同?
我尝试搜索此行为的不同描述,但所有规格都只是原始版本的副本,其中一些使用略有不同的单词,但这根本没有区别。
有什么想法吗?
答案 0 :(得分:1)
这个文字很容易解开......
...但我同意你的观点,一般规则是线程的策略/优先级更改会导致它被放到相关优先级队列的后面,除非{{1 }} ...
......然后该规则有例外。
...所以,当pthread持有互斥锁并且其优先级被更改以避免优先级倒置时,那么将不的线程移动到其优先级队列的后面似乎是合理的
......不那么明显,这意味着什么:
同样,当线程解锁已使用PTHREAD_PRIO_INHERIT或PTHREAD_PRIO_PROTECT协议属性初始化的互斥锁时,如果其原始优先级发生更改,则不应以优先级将其移动到调度队列的尾部。
......我认为这里的关键是"原创"。我认为这意味着如果线程的真正优先级已经改变(显式通过一些调度功能)但线程继续运行,那么后来的互斥锁解锁不需要担心它。我认为这是为了效率......互斥代码必须担心自己的优先级问题,但不任何其他问题。