操作系统实验报告生产者消费者问题解读.docVIP

操作系统实验报告生产者消费者问题解读.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《操作系统》 实验报告 2016年 1月 8日 指导教师对实验报告的评语 成绩: 指导教师签字: 年 月 日 一、设计目标 完成N个生产者和M个消费者线程之间的并发控制,N、M不低于30,数据发送和接收缓冲区尺寸不小于20个(每个产品占据一个)。 其中生产者线程1、3、5、7、9生产的产品供所有奇数编号的消费者线程消费,只有所有奇数编号的消费者线程都消费后,该产品才能从缓冲区中撤销。 其中生产者线程2、4、6、8、10生产的产品所有偶数编号的消费者线程都可消费,任一偶数编号消费者线程消费该消息后,该产品都可从缓冲区中撤销。 其中11-20号生产者线程生产的产品仅供对应编号的消费者线程消费。 其他编号生产者线程生产的产品可由任意的消费者线程消费。 每个生产线程生产30个消息后结束运行。如果一个消费者线程没有对应的生产者线程在运行后,也结束运行。所有生产者都停止生产后,如果消费者线程已经没有可供消费的产品,则也退出运行。 二、背景知识说明 原理 利用进程间共享的信号量、互斥锁等控制线程同步。 相关函数说明 pthread_create(): 创建一个线程阻塞当前的线程,直到另外一个线程运行结束pthread_mutex_lock():占有(阻塞操作)pthread_mutex_unlock():释放sem_wait(): 获取信号量 sem_post(): 释放信号量 三、设计 设计环境 Linux操作系统(ubuntu12.04) gcc 4.6 c语言 Posix线程库 编译命令:gcc consumer.c -lpthread -o consumer 概要设计及详细设计图 注释: (1)图:主函数流程 (2)图:生产者流程 (3)图:消费者流程 (1)图 (2) 图 (3)图 重要代码注释: #includestdio.h #includemalloc.h #includepthread.h #includesemaphore.h #define BUFFER_SIZE 30 #define OVER (-1) struct Product { int tid; int data; }; struct producers { //定义生产者条件变量结构 struct Product buffer[BUFFER_SIZE];//缓冲区 sem_t sem_read; // 读信号量 sem_t sem_write; // 写信号量 pthread_mutex_t wlock; // 缓冲区写锁 pthread_mutex_t rlock; // 缓冲区读锁 pthread_mutex_t lock; // thread_count的读写锁 int readpos , writepos;//读写位置 }; struct producers buffer; int thread_count = 30; //存活生产者计数 //用于在线程内部标识线程ID int ids[30] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}; int count = 0; // 计数消费产品数量 int pcount = 0; // 计数生产产品数量 void init() { //初始化相关锁和变量以及信号量 buffer.readpos = 0; buffer.writepos = 0; //写信号量比缓冲区小1,防止缓冲区满和缓冲区空分不清 sem_init(buffer.sem_write, 0, BUFFER_SIZE-1); sem_init(buffer.sem_read, 0, 0); pthread_mutex_init(buffer.wlock, NULL); pthread_mutex_init(buffer.rlock, NULL); pthread_mutex_init(buffer.lock, NULL); } void put(int tid, int data) { //缓冲区中放入一个数据 sem_wait(buffer.sem_write); //生产前先加锁,已防

文档评论(0)

创业文库 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档