POSIX互斥协议 - 这个规范究竟是什么意思?

时间:2014-09-17 18:04:35

标签: multithreading pthreads posix mutex priority-inversion

在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()(或类似函数)而导致优先级更改的情况?也许这只是一个奇怪的事实描述,这样的线程以从互斥体继承的优先级执行,所以不改变它的原始优先级会有什么不同?

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这个文字很容易解开......

...但我同意你的观点,一般规则是线程的策略/优先级更改会导致它被放到相关优先级队列的后面,除非{{1 }} ...

......然后该规则有例外。

...所以,当pthread持有互斥锁并且其优先级被更改以避免优先级倒置时,那么将的线程移动到其优先级队列的后面似乎是合理的

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

  
    

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

  

......我认为这里的关键是"原创"。我认为这意味着如果线程的真正优先级已经改变(显式通过一些调度功能)但线程继续运行,那么后来的互斥锁解锁需要担心它。我认为这是为了效率......互斥代码必须担心自己的优先级问题,但任何其他问题。