ibse Asked:2020-12-11 15:50:03 +0000 UTC2020-12-11 15:50:03 +0000 UTC 2020-12-11 15:50:03 +0000 UTC C ++中的互斥访问顺序 772 有 2 个线程 ( a, b) 和 1 个互斥锁。互斥锁已由其他线程拥有(nota和 not b)。线程a既b执行lock()又等待互斥体。 释放互斥锁时,线程将按什么顺序访问互斥锁a?b例如,如果线程是第一个锁定(执行lock())a,然后b,线程应该先进入,然后再进入a,b还是不一定? c++ 2 个回答 Voted Harry 2020-12-11T16:44:38Z2020-12-11T16:44:38Z 一般来说,顺序是没有定义的。我无法链接到标准,但 Josattis 的书“ C++ 标准库”在第 18.5.1 节中说锁定顺序是未定义的。 PS据我所知,这并不能阻止一些编译器+操作系统努力避免饥饿,从而确定将其策略应用于锁定调用的一种或另一种排序... “我想是的”(c)维尼 Best Answer nick_n_a 2020-12-11T17:05:35Z2020-12-11T17:05:35Z 不必要。如果优先级相同,则随机。 操作系统的工作原理是有一个“数组”或线程队列等待执行。在最简单的操作系统中,现在谁来工作是随机或按顺序选择的。在现代操作系统中,对线程使用的时间进行统计,并优先考虑时间最被剥夺的线程,并考虑优先级,以便时间在具有相同优先级的线程之间大致均匀分布。 相同优先级的情况下,概率是50%,但是优先级会分配给idler,所以如果第一个线程很长时间没有工作,而第二个线程已经收集了时间统计并且最近停止了,那么第一个线程很可能获得控制权。 如果优先级不同,则可能存在特殊性,但通常会优先考虑具有更高优先级的流,但并非总是如此。
一般来说,顺序是没有定义的。我无法链接到标准,但 Josattis 的书“ C++ 标准库”在第 18.5.1 节中说锁定顺序是未定义的。
PS据我所知,这并不能阻止一些编译器+操作系统努力避免饥饿,从而确定将其策略应用于锁定调用的一种或另一种排序...
“我想是的”(c)维尼
不必要。如果优先级相同,则随机。
操作系统的工作原理是有一个“数组”或线程队列等待执行。在最简单的操作系统中,现在谁来工作是随机或按顺序选择的。在现代操作系统中,对线程使用的时间进行统计,并优先考虑时间最被剥夺的线程,并考虑优先级,以便时间在具有相同优先级的线程之间大致均匀分布。
相同优先级的情况下,概率是50%,但是优先级会分配给idler,所以如果第一个线程很长时间没有工作,而第二个线程已经收集了时间统计并且最近停止了,那么第一个线程很可能获得控制权。
如果优先级不同,则可能存在特殊性,但通常会优先考虑具有更高优先级的流,但并非总是如此。