【发布时间】:2012-02-23 14:20:15
【问题描述】:
假设我有两个变量,protected_var1 和 protected_var2。让我们进一步假设这些变量是通过多个线程更新的,并且是相当独立的,因为通常一个或另一个而不是两者都工作 - 所以它们都有自己的互斥锁以提高效率。
假设:
-在需要两个锁的区域,我总是在代码中按顺序锁定互斥锁(mutex1 然后 mutex2)。
-这两个互斥体都被它们自己在许多其他地方使用(比如锁定 mutex1,或者只是锁定 mutex2)。
在这种情况下,我在函数结束时解锁互斥锁的顺序是否会有所不同?
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);
}
很久以前,我在一次采访中被问到一个关于这种情况的问题,我出来后觉得答案是肯定的——这两个解锁的顺序很重要。我一生都无法弄清楚死锁是如何导致的,尽管如果在使用两者的地方总是以相同的顺序获得锁。
【问题讨论】:
-
...但是在它们没有同时使用的情况下,两个线程可能会相互死锁。为了绝对安全,您应该以相同的顺序锁定两者。是的,它可能会序列化你不需要的东西,但否则你必须确保没有单独锁定的线程可能与它们都被锁定的地方发生冲突。
标签: c++ multithreading pthreads deadlock