【问题标题】:POSIX mutex protocol - what exactly does this spec mean?POSIX 互斥协议——这个规范到底是什么意思?
【发布时间】:2023-03-31 07:15:01
【问题描述】:

在这份 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() (或类似函数)而导致优先级更改的情况?也许这只是对这样一个事实的奇怪描述,即此类线程以从互斥体继承的优先级执行,因此对其原始优先级的更改没有任何影响?

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

有什么想法吗?

【问题讨论】:

    标签: multithreading pthreads posix mutex priority-inversion


    【解决方案1】:

    文字不容易解开……

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

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

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

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

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

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

    【讨论】:

    • 确实这很复杂,因为无论你选择哪个版本,这两个句子中的一个都没有意义(;
    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多