当前位置: 技术问答>linux和unix
linux线程同步问题
来源: 互联网 发布时间:2016-07-26
本文导语: 三个线程无限循环打印出ABC,小弟这段代码错在何处,为何会死锁,请各位指教 #include #include #include #include #include #include #include #include #include #include #include #include #define MAX 1024 #define BUFFSIZE 1024 s...
三个线程无限循环打印出ABC,小弟这段代码错在何处,为何会死锁,请各位指教
是不是要用到其它机制?
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1024
#define BUFFSIZE 1024
static void err_sys(char *fmt,...);
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int flag = 0;
void *thread1(void *arg){
while(1){
pthread_mutex_trylock(&lock);
while(flag!=0)
pthread_cond_wait(&cond,&lock);
if(flag==0){
putchar('A');
flag = 1;
}
pthread_mutex_unlock(&lock);
pthread_cond_signal(&cond);
}
return ((void*)1);
}
void *thread2(void *arg){
while(1){
pthread_mutex_trylock(&lock);
while(flag!=1)
pthread_cond_wait(&cond,&lock);
if(flag==1){
putchar('B');
flag = 2;
}
pthread_mutex_unlock(&lock);
pthread_cond_signal(&cond);
}
return ((void*)2);
}
void *thread3(void *arg){
while(1){
pthread_mutex_trylock(&lock);
while(flag!=2)
pthread_cond_wait(&cond,&lock);
if(flag==2){
puts("C");
flag = 0;
}
pthread_mutex_unlock(&lock);
pthread_cond_signal(&cond);
}
}
void assertErr(int err){
if(err!=0)
err_sys("pthread_create error");
}
int main(int argc, char **argv){
pthread_t a,b,c;
int err;
err = pthread_create(&a,NULL,thread1,NULL);
assertErr(err);
err = pthread_create(&b,NULL,thread2,NULL);
assertErr(err);
err = pthread_create(&c,NULL,thread3,NULL);
assertErr(err);
pthread_join(a,NULL);
pthread_join(b,NULL);
pthread_join(c,NULL);
return 0;
}
static void err_sys(char *fmt,...){
char buf[MAX];
va_list ap;
va_start(ap,fmt);
vsnprintf(buf,MAX,fmt,ap);
va_end(ap);
fputs(buf,stderr);
exit(1);
}
是不是要用到其它机制?
|
你应该用pthread_cond_broadcast 而不是 pthread_cond_signal
后者只会唤醒一个线程,如果那个线程发现flag不是自己想要的,就会继续睡眠,从而引起死锁
后者只会唤醒一个线程,如果那个线程发现flag不是自己想要的,就会继续睡眠,从而引起死锁