实验目的
①实现生产者—消费者问题的模拟,以便更好的理解此经典进程同步问题。生产者-消费者问题是典型的PV操作问题,假设系统中有一个比较大的缓冲池,生产者的任务是只要缓冲池未满就可以将生产出的产品放入其中,而消费者的任务是只要缓冲池未空就可以从缓冲池中拿走产品。缓冲池被占用时,任何进程都不能访问。

②每一个生产者都要把自己生产的产品放入缓冲池,每个消费者从缓冲池中取走产品消费。在这种情况下,生产者消费者进程同步,因为只有通过互通消息才知道是否能存入产品或者取走产品。他们之间也存在互斥,即生产者消费者必须互斥访问缓冲池,即不能有两个以上的进程同时进行。

实验原理
在同一个进程地址空间内执行两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻挡,直到新的物品被生产出来。

生产者流程图

消费者流程图

注意点
①本次实验是关于生产者与消费者之间互斥和同步的问题。问题的是指是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。
②生产者与消费者是一个与现实有关的经验问题,通过此原理举一反三可以解决其他类似的问题。 通过本实验设计,我们对操作系统的P、V进一步的认识,深入的了解P、V操作的实质和其重要性。课本的理论知识进一步阐述了现实中的实际问题。
③Linux环境下编写变异C语言有Windows稍有不同,注意在Linux中编译带有线程

#include <stdio.h>
#include <pthread.h>
#include <windows.h>
#define N 100
#define true 1
#define producerNum  10
#define consumerNum  5
#define sleepTime 1000typedef int semaphore;
typedef int item;
item buffer[N] = {0};
int in = 0;
int out = 0;
int proCount = 0;
semaphore mutex = 1, empty = N, full = 0, proCmutex = 1;void * producer(void * a){while(true){while(proCmutex <= 0);proCmutex--;proCount++;printf("生产一个产品ID%d, 缓冲区位置为%d\n",proCount,in);proCmutex++;while(empty <= 0){printf("缓冲区已满!\n");}empty--;while(mutex <= 0);mutex--;buffer[in] = proCount;in = (in + 1) % N;mutex++;full++;Sleep(sleepTime);}
}void * consumer(void *b){while(true){while(full <= 0){printf("缓冲区为空!\n");}full--;while(mutex <= 0);mutex--;int nextc = buffer[out];buffer[out] = 0;//消费完将缓冲区设置为0out = (out + 1) % N;mutex++;empty++;printf("\t\t\t\t消费一个产品ID%d,缓冲区位置为%d\n", nextc,out);Sleep(sleepTime);}
}int main()
{pthread_t threadPool[producerNum+consumerNum];int i;for(i = 0; i < producerNum; i++){pthread_t temp;if(pthread_create(&temp, NULL, producer, NULL) == -1){printf("ERROR, fail to create producer%d\n", i);exit(1);}threadPool[i] = temp;}//创建生产者进程放入线程池for(i = 0; i < consumerNum; i++){pthread_t temp;if(pthread_create(&temp, NULL, consumer, NULL) == -1){printf("ERROR, fail to create consumer%d\n", i);exit(1);}threadPool[i+producerNum] = temp;}//创建消费者进程放入线程池void * result;for(i = 0; i < producerNum+consumerNum; i++){if(pthread_join(threadPool[i], &result) == -1){printf("fail to recollect\n");exit(1);}}//运行线程池return 0;
}


更多内容访问omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2018 • OmegaXYZ-版权所有 转载请注明出处

生产者与消费者问题C语言实现相关推荐

  1. Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型

    如题,使用条件变量Cond和channel通道实现多个生产者和消费者模型.Go语言天生带有C语言的基因,很多东西和C与很像,但是用起来 绝对比C语言方便.今天用Go语言来实现下多消费者和生产者模型.如 ...

  2. c语言生产者与消费者实验报告,生产者和消费者实验报告.doc

    生产者和消费者实验报告 [实验目的] 加深对进程概念的理解,明确进程和程序的区别. 进一步认识并发执行的实质. 验证用信号量机制实现进程互斥的方法. 验证用信号量机制实现进程同步的方法. [实验要求] ...

  3. C语言生产者消费者实验报告,生产者与消费者实验报告.doc

    生产者与消费者实验报告.doc 生产者和消费者实验报告[实验目的]1. 加深对进程概念的理解,明确进程和程序的区别.2. 进一步认识并发执行的实质.3. 验证用信号量机制实现进程互斥的方法.4. 验证 ...

  4. 操作系统 使用C语言实现生产者和消费者问题

    生产者与消费者问题描述及原理在这里不赘述,这是用c语言简单实现了一下,加上代码不超过100行. #include <stdio.h> #include <windows.h># ...

  5. windows进程生产者消费者代码c语言,生产者消费者问题---C语言实现

    生产者消费者问题(Producer-consumer problem) 是一个多线程同步问题的经典案例. 生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗 ...

  6. java+创建metaq生产者_微服务架构【技术点4】windows下rocketMQ配置及java端生产者消费者配置-Go语言中文社区...

    参考资料 windows下配置rocketMQ 解压缩 系统环境变量配置 变量名:ROCKETMQ_HOME 变量值:MQ解压路径MQ文件夹名 启动NAMESERVER Cmd命令框执行进入至'MQ文 ...

  7. 进程同步生产者-消费者问题C语言,经典进程同步问题 --- 生产者和消费者

    问题描述: 一组生产者进程和一组消费者进程共享一个初始为空.大小为 n 的缓冲区,只 有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待;只有缓冲区 不空时,消费者才能从中取出消息,否则必须等 ...

  8. 生产者消费者模型——C语言代码详解

    概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者 ...

  9. 操作系统:生产者与消费者问题

    使用信号量实现生产者-消费者问题 问题描述:使用一个缓冲区来保存物品,只有缓冲区没有满,生产者才可以放入物品:只有缓冲区不为空,消费者才可以拿走物品. 因为缓冲区属于临界资源,因此需要使用一个互斥量 ...

最新文章

  1. 用AI为美国政府“助纣为虐”,微软员工怒了
  2. matlab 句柄图像尝试
  3. double java 坑,Java中四则运算的那些坑
  4. 图像白化MATLAB代码实现
  5. python 在互联网应用是如此强大
  6. oracle 获取系统年 月,Oracle 获取当前年、月、日
  7. Class create, device create, device create file
  8. OracleXE安装完成后 http://127.0.0.1:8080/apex 总是在刷新无法打开
  9. 【Axure电商原型】电商app高保真原型、移动端通用版电商app模板、用户中心、会员体系、签到、高保真商城app、rp原型、直播、运营活动、订单管理、售后退款、电商系统、购物车、高保真移动端电商
  10. JS实现 EventBus
  11. nmon安装为什么重启mysql_Centos7部署nmon监控工具
  12. mysql数据库p_PbootCMS Sqlite数据库转Mysql数据库教程
  13. C语言中的数据类型及输出格式
  14. Hadoop常用端口号汇总
  15. 腾讯云 python接口_Python 服务端集成 腾讯云 IM 服务
  16. 罗马数字序号与word2013中如何插入
  17. javascript 获取具体id
  18. 搜狗搜索引擎收录方法
  19. 第一个入门级的JavaWeb项目(IDEA)
  20. 功能化M-IRPA-MOF负载型催化剂-单原子Ca-MOF纳米复合催化剂

热门文章

  1. pcf8563 C语言编程
  2. 属于 PingCAP 用户和开发者的 2022 年度记忆
  3. python零基础入门教程视频下载-零基础学Python入门教程,视频资源下载
  4. 万家杨柳青烟里:B+、B- 树的应用场景
  5. vanilla js_用Vanilla js编写前端组件
  6. 详解Cisco ACS AAA认证
  7. 康拓排列以及全排列老年人听不懂系列
  8. 发现一款自学Java可视化工具神器,非常牛逼,太爱了!
  9. NVIDIA GPU开源驱动编译学习架构分析
  10. 医疗器械经营许可证,您了解多少?