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 导致死锁的主要内容,如果未能解决你的问题,请参考以下文章