pthread_mutex_lock 导致死锁

6

我正在使用上述代码来使用两个线程增加计数器,这两个线程独立地获取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; 
}

请问我到底做错了什么?


2
可能你想要的是 int* counter = counter_addr++*counter - Jens Gustedt
4个回答

13

你正在尝试多次锁定互斥量max,然后增加counter并释放一次。

请尝试:

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

2
哦..那是一个糟糕的编程错误..谢谢指出。 :) - Shehbaz Jaffer

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; 
}
  • 两个或更多线程仅共享全局作用域数据或位于堆(malloc)上的数据。
  • 两个或更多线程不共享定义在堆栈上的变量,这些数据对于每个线程都是唯一的,因此无需锁定它。

欢迎阅读答案中的内容,了解共享和非共享等内容。


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

0
作为一个原则,同一个线程不应该多次锁定一个互斥量,而这就是在此处发生的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接