Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading POSIX互斥协议-这个规范到底意味着什么?_Multithreading_Pthreads_Posix_Mutex_Priority Inversion - Fatal编程技术网

Multithreading POSIX互斥协议-这个规范到底意味着什么?

Multithreading POSIX互斥协议-这个规范到底意味着什么?,multithreading,pthreads,posix,mutex,priority-inversion,Multithreading,Pthreads,Posix,Mutex,Priority Inversion,在本POSIX互斥协议文档中,我们可以阅读以下部分: 当线程持有已用初始化的互斥锁时 PTHREAD_PRIO_继承或PTHREAD_PRIO_保护协议属性 不得移动到计划的末尾 在其原始优先级为 已更改,例如通过调用sched_setparam()。同样,当 线程解锁已使用初始化的互斥锁 PTHREAD_PRIO_继承或PTHREAD_PRIO_保护协议属性 不得移动到计划的末尾 在其原始优先级为 变了 这可能是对该片段的引用: 如果某个线程的策略或优先级已被修改,而不是 pthread_se

在本POSIX互斥协议文档中,我们可以阅读以下部分:

当线程持有已用初始化的互斥锁时 PTHREAD_PRIO_继承或PTHREAD_PRIO_保护协议属性 不得移动到计划的末尾 在其原始优先级为 已更改,例如通过调用sched_setparam()。同样,当 线程解锁已使用初始化的互斥锁 PTHREAD_PRIO_继承或PTHREAD_PRIO_保护协议属性 不得移动到计划的末尾 在其原始优先级为 变了

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

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

(来源、附表FIFO说明)

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

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

我试图搜索对这种行为的不同描述,但所有规范都只是原始规范的副本,有些规范使用了稍微不同的词语,但这一点都没有区别


有什么想法吗?

这篇文章很难理清

…但我同意您的看法,一般规则是,对线程的策略/优先级的更改会导致将其放在相关优先级队列的后面,除非该更改是由
pthread\u setschedprio()
进行的

…这条规则也有例外

…因此,当pthread持有互斥对象并更改其优先级以避免优先级反转时,线程不移动到其优先级队列的后面似乎是合理的

…不太明显,这意味着:

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


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

事实上,这非常复杂,因为无论您选择哪个版本,这两句话中的一句都毫无意义(;