pthread_mutex_lock导致死锁

时间:2012-09-29 06:44:43

标签: c locking pthreads

我使用上面的代码使用2个线程递增计数器,这些线程独立地使用mut锁和递增计数器。线程进入此函数后,我面临死锁。

 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; 
}

有谁能告诉我到底哪里出错?

4 个答案:

答案 0 :(得分:12)

您尝试锁定互斥锁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共享内容和未共享内容等。

答案 2 :(得分:0)

作为一个原则,同一个线程不应该多次锁定互斥锁,以及这里发生的事情。

答案 3 :(得分: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);
}