假设我有两个变量,protected_var1
和 protected_var2
。让我们进一步假设这些变量是通过多个线程更新的,并且是相当独立的,因为通常一个或另一个而不是两个都在工作 - 所以它们都有自己的互斥保护以提高效率。
假设:
-我总是在我的代码中需要两个锁的区域按顺序锁定互斥体(mutex1 然后 mutex2)。
-这两个互斥锁在许多其他地方都被它们自己使用(比如只锁定互斥锁 1,或者只锁定互斥锁 2)。
我在函数末尾同时使用两者解锁互斥锁的顺序在这种情况下是否有所不同?
void foo()
{
pthread_mutex_lock(&mutex1);
pthread_mutex_lock(&mutex2);
int x = protected_var1 + protected_var2;
pthread_mutex_unlock(&mutex1); //Does the order of the next two lines matter?
pthread_mutex_unlock(&mutex2);
}
很久以前我在接受采访时被问到一个关于这种情况的问题,我觉得答案是肯定的——这两个解锁的顺序确实很重要。我终其一生都无法弄清楚死锁是如何导致的,尽管无论在何处使用锁总是以相同的顺序获得。
最佳答案
顺序无关紧要,只要您不尝试获取 版本之间的另一个锁。重要的是永远 以相同的顺序获取锁;否则,您将面临陷入僵局的风险。
编辑:
要扩展约束:您必须在其中建立严格的排序
互斥量,例如mutex1
在 mutex2
之前(但此规则适用于
任意数量的互斥体)。如果你
不要持有按顺序排在它后面的互斥锁;例如你不可以
如果您持有 mutex2
的锁,则请求锁定 mutex1
。任何时候
这些规则受到尊重,你应该是安全的。关于
释放,如果你释放了mutex1
,那么在之前尝试重新获取它
释放 mutex2
,你违反了规则。在这方面,可能有
在遵守类似堆栈的顺序方面有一些优势:最后获得的是
总是第一个发布。但这是一种间接影响:
规则是如果你持有一个,你不能请求锁定 mutex1
互斥量 2
。无论您在执行操作时是否锁定了 mutex1
是否获取了 mutex2
上的锁。
关于c++ - 解锁互斥体的顺序在这里有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9414812/