6

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

4 回答 4

14

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

尝试:

for(iter=0;iter< max ;iter++)
{
  // LOCK  
  pthread_mutex_lock(&mut);
  counter++;
  // UNLOCK 
  pthread_mutex_unlock(&mut);
}
return NULL; 
于 2012-09-29T06:49:17.640 回答
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 个或更多线程仅共享全局范围数据或位于 heap( malloc) 上的数据。
  • 2 个或更多线程不共享堆栈上定义的变量,此数据对每个线程都是唯一的,无需锁定。

欢迎您阅读答案 中共享的内容和未共享的内容等。

于 2012-09-29T06:51:47.073 回答
0

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

于 2012-09-29T09:25:24.923 回答
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);
}
于 2013-10-26T21:16:53.107 回答