我使用上面的代码使用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;
}
有谁能告诉我到底哪里出错?
答案 0 :(得分:12)
您尝试锁定互斥锁max
次,然后递增counter
并释放一次。
尝试:
for(iter=0;iter< max ;iter++)
{
// LOCK
pthread_mutex_lock(&mut);
counter++;
// UNLOCK
pthread_mutex_unlock(&mut);
}
return NULL;
答案 1 :(得分: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
)。欢迎您阅读in the answers共享内容和未共享内容等。
答案 2 :(得分:0)
作为一个原则,同一个线程不应该多次锁定互斥锁,以及这里发生的事情。
答案 3 :(得分: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);
}