【问题标题】:pthread_mutex_lock causes deadlockpthread_mutex_lock 导致死锁
【发布时间】: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

标签: c locking pthreads


【解决方案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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-27
        • 2018-04-20
        • 2018-06-04
        • 2016-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多