先看代码 //创建三个线程顺序打印abc//利用条件变量加互斥量实现//#include#include#include#include#include//线程相关的头文件int i=0;int n=0;//声明互斥量,条件变量pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond=PTHREAD_COND_INITIALIZER;void* printa(){
while(n<10)
{
pthread_mutex_lock(&mutex);
while(i!=1)
pthread_cond_wait(&cond,&mutex);
pthread_t tid;
tid=pthread_self();
printf("a
tid:%lu\n",tid);
i++;
pthread_mutex_unlock(&mutex);
sleep(1);
}
return (void *)0;}void* printb(){
while(n<10){
pthread_mutex_lock(&mutex);
while(i!=2)
pthread_cond_wait(&cond,&mutex);
pthread_t tid;
tid=pthread_self();
printf("b
tid:%lu\n",tid);
i++;
pthread_mutex_unlock(&mutex);
}
return (void *)0;}void* printc(){
while(n<10)
{
pthread_mutex_lock(&mutex);
while(i!=3)
pthread_cond_wait(&cond,&mutex);
pthread_t tid;
tid=pthread_self();
printf("c
tid:%lu\n",tid);
i=1;
n++;
sleep(1);
pthread_mutex_unlock(&mutex);
printf("\n");
}
return (void *)0;}int main(){
pthread_t tid;
int err;
err=pthread_create(&tid,NULL,printa,NULL);
if(err!=0)
printf("pthread_creat erro\n");
err=pthread_create(&tid,NULL,printb,NULL);
if(err!=0)
printf("pthread_creat erro\n");
err=pthread_create(&tid,NULL,printc,NULL);
if(err!=0)
printf("pthread_creat erro\n");
pthread_mutex_lock(&mutex);
i++;
pthread_mutex_unlock(&mutex);
while(1)
{
if(i==1||i==2||i==3)
pthread_cond_broadcast(&cond);
if(n==10)
break;
}
exit(0);} 条件变量决定线程是否输出,互斥量保护对条件。需要解释的是pthread_cond_wait()传入的参数是锁着的互斥量和条件,函数内部会对互斥量进行解锁,这样其他线程申请互斥量加锁的操作可以成功,3个线程都会停留在while(条件)这里。最后注意记得pthread_cond_broadcast(&cond);