c语言实现多个生产者和消费者_第1页
c语言实现多个生产者和消费者_第2页
c语言实现多个生产者和消费者_第3页
c语言实现多个生产者和消费者_第4页
c语言实现多个生产者和消费者_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上操作系统的一个经典问题是"生产者-消费者"问题, 这涉及同步信号量和互斥信号量的应用, 在这里,我用线程的同步和互斥来实现./* author 张文* 2008/06/20*/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <semaphore.h>#define N 2   / 消费者或者生产者的数目#define M 10 /

2、 缓冲数目int in = 0;   / 生产者放置产品的位置int out = 0; / 消费者取产品的位置int buffM = 0; / 缓冲初始化为0, 开始时没有产品sem_t empty_sem; / 同步信号量, 当满了时阻止生产者放产品sem_t full_sem;   / 同步信号量, 当没产品时阻止消费者消费pthread_mutex_t mutex; / 互斥信号量, 一次只有一个线程访问缓冲int product_id = 0;   /生产者

3、idint prochase_id = 0; /消费者id/* 打印缓冲情况 */void print()int i;for(i = 0; i < M; i+)   printf("%d ", buffi);printf("n");/* 生产者方法 */ void *product()int id = +product_id;while(1)   / 用sleep的数量可以调节生产和消费的速度,便于观察   sleep(1);   /sleep(1)

4、;     sem_wait(&empty_sem);   pthread_mutex_lock(&mutex);     in = in % M;   printf("product%d in %d. like: t", id, in);     buffin = 1;     print();     +in;

5、0;    pthread_mutex_unlock(&mutex);   sem_post(&full_sem);  /* 消费者方法 */void *prochase()int id = +prochase_id;while(1)   / 用sleep的数量可以调节生产和消费的速度,便于观察   sleep(1);/sleep(1);     sem_wait(&full_sem);   pthre

6、ad_mutex_lock(&mutex);     out = out % M;   printf("prochase%d in %d. like: t", id, out);     buffout = 0;   print();   +out;     pthread_mutex_unlock(&mutex);   sem_post(&empty_

7、sem);int main()pthread_t id1N;pthread_t id2N;int i;int retN;/ 初始化同步信号量int ini1 = sem_init(&empty_sem, 0, M); int ini2 = sem_init(&full_sem, 0, 0);  if(ini1 && ini2 != 0)   printf("sem init failed n");   exit(1); /初始化互斥信号量 int ini

8、3 = pthread_mutex_init(&mutex, NULL);if(ini3 != 0)   printf("mutex init failed n");   exit(1); / 创建N个生产者线程for(i = 0; i < N; i+)   reti = pthread_create(&id1i, NULL, product, (void *)(&i);   if(reti != 0)     &#

9、160; printf("product%d creation failed n", i);    exit(1);   /创建N个消费者线程for(i = 0; i < N; i+)   reti = pthread_create(&id2i, NULL, prochase, NULL);   if(reti != 0)       printf("prochase%d creation failed n", i);    exit(1);   /销毁线程for(i = 0; i < N; i+)   pthread_join(id1i,NULL);   pthread_join(id2i,NULL);exit(0); 关于这个程序中的同步和互斥操作,很多网上资料都说必须先同步再互斥,否则会

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论