基于条件变量和互斥量同步的三线程顺序打印abc(10次)实现

来源:互联网 发布:制作动态原理图软件 编辑:程序博客网 时间:2024/06/10 11:05

先看代码

//创建三个线程顺序打印abc//利用条件变量加互斥量实现//#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>#include<pthread.h>//线程相关的头文件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);

0 0
原创粉丝点击