【发布时间】:2017-03-06 14:27:12
【问题描述】:
我在我的程序中使用了 2 个线程,1 个用于打印偶数,另一个用于顺序打印奇数。当我运行下面的代码时,程序在打印 0 和 1 后会阻塞。看起来像死锁。
但是,如果我将 rc=pthread_mutex_lock(&mutex) 移动到 PrintEvenNos() 和 PrintOddNos() 中的 while 语句上方,则输出是连续且完整的(根据需要)。
有人可以解释为什么它在第一种情况下失败以及导致死锁的原因是什么?
#include<stdio.h>
#include<pthread.h>
pthread_t tid[2];
unsigned int shared_data = 0;
pthread_mutex_t mutex;
pthread_cond_t even,odd;
unsigned int rc;
void* PrintEvenNos(void*);
void* PrintOddNos(void*);
void main(void)
{
pthread_create(&tid[0],0,&PrintEvenNos,0);
pthread_create(&tid[1],0,&PrintOddNos,0);
sleep(3);
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
}
void* PrintEvenNos(void *ptr)
{
//rc = pthread_mutex_lock(&mutex); /*works when I uncomment here and comment the next mutex_lock */
while (shared_data <= 5)
{rc = pthread_mutex_lock(&mutex);
if(shared_data%2 == 0)
{ printf("t1.....................................Even:%d\n",shared_data);
shared_data++;
pthread_cond_signal(&odd);
rc=pthread_mutex_unlock(&mutex);
}
else
{
pthread_cond_wait(&even, &mutex);
}
}
rc=pthread_mutex_unlock(&mutex);
}
void* PrintOddNos(void* ptr1)
{
// rc = pthread_mutex_lock(&mutex); /*works when I uncomment here and comment the next mutex_lock */
while (shared_data <= 5)
{
rc = pthread_mutex_lock(&mutex);
if(shared_data%2 != 0)
{
printf("t2.....................................odd:%d\n",shared_data);
shared_data++;
pthread_cond_signal(&even);
rc=pthread_mutex_unlock(&mutex);
}
else
{
pthread_cond_wait(&odd, &mutex);
}
}
rc=pthread_mutex_unlock(&mutex);
}
【问题讨论】:
-
除了给出的答案之外,您还需要静态或使用 pthread_mutex_init() 初始化您的互斥锁。
-
是的,还有条件变量。其实这里已经有默认初始化了,因为这些都是全局变量。但这通常是不够的,您需要使用
PTHREAD_MUTEX_INITIALIZER和PTHREAD_COND_INITIALIZER。
标签: c multithreading mutex