2013-05-10 29 views
-2

我正在用C编写一个程序,其中有3个函数,A,B和C.我有一个静态互斥锁作为全局锁定对这些函数的访问。功能A,B和C,并以任意顺序被称为从多线程的话,我的代码如下:基本死锁问题,多个函数中的一个互斥体

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

int A() { 
    pthread_mutex_lock(&mutex); 
    ... do some processing... 
    pthread_mutex_unlock(&mutex); 
    return anInt; 
} 

int B() { 
    pthread_mutex_lock(&mutex); 
    ... do some processing... 
    pthread_mutex_unlock(&mutex); 
    return anInt; 
} 

int C() { 
    pthread_mutex_lock(&mutex); 
    ... do some processing... 
    pthread_mutex_unlock(&mutex); 
    return anInt; 
} 

什么可能导致的僵局?

+1

你能发表更多的代码吗?除了缺少返回语句外,还有什么看起来是正确的。 – hmjd 2013-05-10 21:46:59

+0

在调用'pthread_mutex_unlock'之前,是否有通过代码退出函数的任何路径?或者你的一个函数调用锁中的其他函数之一? – simonc 2013-05-10 21:47:35

+0

@simonc不,A,B和C按顺序调用,但是按不同的线程调用,所以可能按顺序调用 – user1660675 2013-05-10 22:16:20

回答

2

您的代码很干净。

有两种可能死锁,如果我们跳过罕见的情况下内存违规等:

  1. 调用任何一个的(),B(),或从“锁定”部分C()这些功能中的任何一个。

  2. 从没有pthread_mutex_unlock()的这些函数的“锁定”部分返回。

两种情况会导致因为pthread_mutex_lock()的同一互斥的两个人通话的僵局。

对不起,如果我的英语不好:)

+0

您的英语很好, 感谢您的答复。这些是我认为是自己的两种可能性,但在审查我的代码时,我没有看到它们会如何发生,所以我很好奇是否有第三种可能性。我将不得不仔细看看我的代码。 – user1660675 2013-05-14 14:38:14