2012-09-29 150 views
6

我正在使用上面的代码来增加一个计数器使用2个线程,这些线程独立采用mut锁定和增量计数器。线程进入这个函数后我面临死锁。pthread_mutex_lock导致死锁

pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; 

void *increment_counter(void *counter_addr) 
{ 
    int max = MAX_COUNTER_VALUE; 
    int iter; 
    int counter; 

    for(iter=0;iter< max ;iter++) 
    // LOCK 
    pthread_mutex_lock(&mut); 
    counter++; 
    // UNLOCK 
    pthread_mutex_unlock(&mut); 
    return NULL; 
} 

任何人都可以告诉我我到底错在哪里?

+2

也许你想'INT *计数器= counter_addr'和'++ * counter'。 –

回答

10

您试图锁定互斥锁max次,然后增加counter并释放一次。

尝试:

for(iter=0;iter< max ;iter++) 
{ 
    // LOCK 
    pthread_mutex_lock(&mut); 
    counter++; 
    // UNLOCK 
    pthread_mutex_unlock(&mut); 
} 
return NULL; 
+1

哦..这是一个糟糕的编程错误..谢谢指出它。 :) –

3

也就是说,也许你试着这样做:

int max = MAX_COUNTER_VALUE; 
int iter; 
int counter; 
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; 

void *increment_counter(void *counter_addr) 


{ 

    pthread_mutex_lock(&mut);  
    for(iter=0;iter< max ;iter++) 
     counter++; 
    pthread_mutex_unlock(&mut); 
    return NULL; 
} 
  • 2个或更多的线程共享只有全球范围内的数据或位于 堆数据(malloc) 。
  • 2个或更多线程不共享栈中定义的变量这个 数据对于每个线程都是唯一的,并且不需要锁定它。

欢迎你阅读in the answers什么是共享的,什么是不共享等

0

作为一项原则,在同一个线程不应该锁定一个互斥体一次,并且这是这里发生了什么。

0

锁的初始化非常重要。如果你没有将你的锁初始化为正确的值,你的代码就会中断。初始化你的锁一种方法如下:

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 

您也可以通过下面的代码动态地做这个任务:

int rc = pthread_mutex_init(&lock, NULL); 
assert(rc == 0); // always check success! 

除了锁初始化,你应该检查的pthread_mutex_lock返回代码看它是否失败,好像它失败了,多个线程可以进入临界区。为了这个目的,你可以使用一个类似的代码检查的pthread_mutex_lock返回代码:

// Use this to keep your code clean but check for failures 
// Only use if exiting program is OK upon failure 
void Pthread_mutex_lock(pthread_mutex_t *mutex) { 
int rc = pthread_mutex_lock(mutex); 
assert(rc == 0); 
}