- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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);
//生产前先加锁,已防
您可能关注的文档
最近下载
- 一种基于压力监测的输液港自动封堵装置.pdf VIP
- 菠菜种植课件PPT.pptx VIP
- 紫色复古风《莴苣姑娘》童话故事PPT模板.pptx VIP
- 盐雾试验报告-.docx VIP
- [青海]水电站厂房机电设备安装工程量清单及招标文件.doc VIP
- 拓展低空经济应用场景实施方案.pptx VIP
- 第5课 中国古代官员的选拔与管理 课件(共45张PPT) 统编版高中历史选择性必修1(内嵌视频+音频).pptx VIP
- 时间序列分析—基于Python王燕习题答案.pdf VIP
- 百度AI营销认证初级考试理论知识题库(628题).docx
- 2025年电力安全工作规程(发电厂和变电站电气部分)题库(294道) .pdf VIP
文档评论(0)