pthread_mutex_lock 导致死锁

Posted

技术标签:

【中文标题】pthread_mutex_lock 导致死锁【英文标题】:pthread_mutex_lock causes deadlock 【发布时间】:2012-09-20 23:07:22 【问题描述】:

我正在使用上面的代码使用 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; 

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

【问题讨论】:

可能你想要int* counter = counter_addr++*counter 【参考方案1】:

您尝试将互斥锁锁定max 次,然后递增counter 并释放一次。

试试:

for(iter=0;iter< max ;iter++)

  // LOCK  
  pthread_mutex_lock(&mut);
  counter++;
  // UNLOCK 
  pthread_mutex_unlock(&mut);

return NULL; 

【讨论】:

哦..这是一个糟糕的编程错误..感谢您指出。 :)【参考方案2】:

这也许是你试图做的:

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 个或更多线程不共享堆栈上定义的变量 this 每个线程的数据都是唯一的,无需锁定。

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

【讨论】:

【参考方案3】:

原则上,同一个线程不应多次锁定互斥体,这就是这里发生的情况。

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于pthread_mutex_lock 导致死锁的主要内容,如果未能解决你的问题,请参考以下文章

利用pt-deadlock-logger监控死锁

第9章 线程编程_死锁

Linux学习_线程的死锁和信号

pthread_mutex_lock和EAGAIN

线程死锁例子

pthread_mutex_lock 和 pthread_mutex_lock 在另一个线程中