您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > c语言实现多个生产者和消费者
操作系统的一个经典问题是生产者-消费者问题,这涉及同步信号量和互斥信号量的应用,在这里,我用线程的同步和互斥来实现./**author张文*2008/06/20*/#includestdio.h#includestdlib.h#includeunistd.h#includepthread.h#includesemaphore.h#defineN2//消费者或者生产者的数目#defineM10//缓冲数目intin=0;//生产者放置产品的位置intout=0;//消费者取产品的位置intbuff[M]={0};//缓冲初始化为0,开始时没有产品sem_tempty_sem;//同步信号量,当满了时阻止生产者放产品sem_tfull_sem;//同步信号量,当没产品时阻止消费者消费pthread_mutex_tmutex;//互斥信号量,一次只有一个线程访问缓冲intproduct_id=0;//生产者idintprochase_id=0;//消费者id/*打印缓冲情况*/voidprint(){inti;for(i=0;iM;i++)printf(%d,buff[i]);printf(\n);}/*生产者方法*/void*product(){intid=++product_id;while(1){//用sleep的数量可以调节生产和消费的速度,便于观察sleep(1);//sleep(1);sem_wait(&empty_sem);pthread_mutex_lock(&mutex);in=in%M;printf(product%din%d.like:\t,id,in);buff[in]=1;print();++in;pthread_mutex_unlock(&mutex);sem_post(&full_sem);}}/*消费者方法*/void*prochase(){intid=++prochase_id;while(1){//用sleep的数量可以调节生产和消费的速度,便于观察sleep(1);//sleep(1);sem_wait(&full_sem);pthread_mutex_lock(&mutex);out=out%M;printf(prochase%din%d.like:\t,id,out);buff[out]=0;print();++out;pthread_mutex_unlock(&mutex);sem_post(&empty_sem);}}intmain(){pthread_tid1[N];pthread_tid2[N];inti;intret[N];//初始化同步信号量intini1=sem_init(&empty_sem,0,M);intini2=sem_init(&full_sem,0,0);if(ini1&&ini2!=0){printf(seminitfailed\n);exit(1);}//初始化互斥信号量intini3=pthread_mutex_init(&mutex,NULL);if(ini3!=0){printf(mutexinitfailed\n);exit(1);}//创建N个生产者线程for(i=0;iN;i++){ret[i]=pthread_create(&id1[i],NULL,product,(void*)(&i));if(ret[i]!=0){printf(product%dcreationfailed\n,i);exit(1);}}//创建N个消费者线程for(i=0;iN;i++){ret[i]=pthread_create(&id2[i],NULL,prochase,NULL);if(ret[i]!=0){printf(prochase%dcreationfailed\n,i);exit(1);}}//销毁线程for(i=0;iN;i++){pthread_join(id1[i],NULL);pthread_join(id2[i],NULL);}exit(0);}关于这个程序中的同步和互斥操作,很多网上资料都说必须先同步再互斥,否则会有死锁,我认为这是错的。事实上,生产者中先同步再互斥,而消费者先互斥再同步,或反之;以及生产者和消费者都先互斥再同步这几种情况都不会死锁,因为它们间并没有交叉关系,就更不可能形成死锁环。之所以先同步,再互斥,是为了更好的并发性:并发性的瓶颈是互斥区,先同步再互斥,使得互斥区代码更短。
本文标题:c语言实现多个生产者和消费者
链接地址:https://www.777doc.com/doc-4905506 .html