- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验四-同步与互斥-Linux 实验报告
实验四 同步与互斥
【实验目的和要求】
1
1、掌握进程(线程)的同步与互斥。
2、掌握生产者消费者问题的实现方法。
3、掌握多线程编程方法。
【实验内容】
实现生产者消费者问题
实现生产者消费者问题
1、有一个仓库,生产者负责生产产品,并放入仓库,消费者会从仓库中拿走产 品(消费)。
2、仓库中每次只能入一个(生产者或消费者)。
3、仓库中可存放产品的数量最多 10 个,当仓库放满时,生产者不能再放入产品。
4、当仓库空时,消费者不能从中取出产品。
5、生产、消费速度不同。
1、 信号量
1、 信号量 mutex 提供对缓冲池访问的互斥要求并初始化为 1,信号量 empty 和full 分别用来表示空缓冲项和满缓冲项的个数,信号量 empty 初始化为 n, 信号量 full 初始化为 0。
2、定义如下结构及数据:
定义缓冲区内的数据类型:typedef int buffer_item;
缓冲区 :buffer_item buffer[BUFFER_SIZE];
对缓冲区操作的变量:int in,out;
信号量 mutex 提供了对缓冲池访问的互斥要求:pthread_mutex_t mutex;
信号量 empty 和 full 分别表示空缓冲顶和满缓冲顶的个数:sem_t empty,full;
可以设定生产者的生产速度及消费者的消费速度 :int pro_speed,con_speed;
对缓冲区操作的自增函数:#define inc(k) if(k BUFFER_SIZE) k = k+1;else k=0
3、并定义了如下实现问题的函数模块:
将生产的产品放入缓冲区: int insert_item(buffer_item item) 从缓冲区内移走一个产品: int remove_item(buffer_item *item) 生产者进程 :void *producer(void *param)
消费者进程:void *consumer(void *param)
生产者结构进程 消费者结构进程
【程序代码】
//sx.c #includestdio.h
#includestdlib.h #includepthread.h #includesemaphore.h #includetime.h
#define inc(k) if(kBUFFER_SIZE) k=k+1;else k=0 #define BUFFER_SIZE 10//缓冲区的大小
typedef int buffer_item;//定义缓冲区内的数据类型
buffer_item buffer[BUFFER_SIZE];//缓冲区int in,out;//对缓冲区操作的变量
pthread_mutex_t mutex;//信号量 mutex 提供了对缓冲池访问的互斥要求sem_t empty,full;//信号量 empty 和 full 分别表示空缓冲顶和满缓冲顶的个数int pro_speed,con_speed;//可以设定生产者的生产速度及消费者的消费速度int insert_item(buffer_item item)
{//将生产的产品放入缓冲区buffer[in]=item;
printf(******insert 缓冲池第%d 号******\n,in); inc(in);
}
int remove_item(buffer_item *item)
{//从缓冲区内移走一个产品
*item = buffer[out];
printf(******remove 缓冲池第%d 号******\n,out); inc(out);
}
void *producer(void *param)
{//生产者进程buffer_item item; int num = 0; while(1)
{
sleep(rand()%(16-pro_speed));
printf(\n******第%d 次生产******\n,++num); printf(****** 等 待 empty 信 号 ******\n); sem_wait(empty);
printf(****** 等 待 解 锁 ******\n); pthread_mutex_lock(mutex); printf(******上锁,准备生产******\n); item = rand()%1000+1;
printf(******生产产品%d*******\n,item); insert_item(item);
printf(*******解锁******\n);
printf(******第%d 次生产结束*******\n\n,num)
您可能关注的文档
最近下载
- 高中政治8.3 正确对待外来文化(最新版).pptx VIP
- 公立医院绩效工资管理及亏损应对政策摘要.docx
- 股骨粗隆间骨折教学查房.ppt VIP
- 第5章 问题解决策略:逐步确定 课件(共26张PPT)2025-2026学年度北师大版数学八年级上册.pptx VIP
- 2025年ESICM循环休克与血流动力学监测指南解读.docx VIP
- 2025-2026年公务员(国考)之行政职业能力测验真题精选附 .pdf VIP
- 画法几何及机械制图习题集(第八版).docx
- 国家基层高血压防治管理指南2025版解读PPT课件.pptx VIP
- 2025年宿迁市公需考试试题.docx VIP
- 担保应急预案.docx VIP
原创力文档


文档评论(0)