




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上实验四 同步与互斥 【实验目的和要求】1、掌握进程(线程)的同步与互斥。2、掌握生产者消费者问题的实现方法。3、掌握多线程编程方法。【实验内容】实现生产者消费者问题1、有一个仓库,生产者负责生产产品,并放入仓库,消费者会从仓库中拿走产品(消费)。2、仓库中每次只能入一个(生产者或消费者)。3、仓库中可存放产品的数量最多10个,当仓库放满时,生产者不能再放入产品。4、当仓库空时,消费者不能从中取出产品。5、生产、消费速度不同。【实验原理】1、 信号量mutex提供对缓冲池访问的互斥要求并初始化为1,信号量empty和full分别用来表示空缓冲项和满缓冲项的个数,信号量e
2、mpty初始化为n,信号量full初始化为0。2、定义如下结构及数据: 定义缓冲区内的数据类型:typedef int buffer_item; 缓冲区 :buffer_item bufferBUFFER_SIZE;对缓冲区操作的变量:int in,out; 信号量mutex提供了对缓冲池访问的互斥要求:pthread_mutex_t mutex; 信号量empty和full分别表示空缓冲顶和满缓冲顶的个数:sem_t empty,full; 可以设定生产者的生产
3、速度及消费者的消费速度 :int pro_speed,con_speed;对缓冲区操作的自增函数:#define inc(k) if(k < BUFFER_SIZE) k = k+1;else k=03、并定义了如下实现问题的函数模块: 将生产的产品放入缓冲区: int insert_item(buffer_item item) 从缓冲区内移走一个产品: int
4、;remove_item(buffer_item *item) 生产者进程 :void *producer(void *param) 消费者进程:void *consumer(void *param) 生产者结构进程 消费者结构进程【程序代码】/sx.c#include<stdio.h>#include<std
5、lib.h>#include<pthread.h>#include<semaphore.h>#include<time.h>#define inc(k) if(k<BUFFER_SIZE) k=k+1;else k=0#define BUFFER_SIZE 10/缓冲区的大小typedef int buffer_item;/定义缓冲区内的数据类型buffer_item bufferBUFFER_SIZE;/缓冲区int in,out;/对缓冲区操作的变量pthread_mutex_t mutex;/信号量mutex提供了对缓冲池访问的互斥要求se
6、m_t empty,full;/信号量empty和full分别表示空缓冲顶和满缓冲顶的个数int pro_speed,con_speed;/可以设定生产者的生产速度及消费者的消费速度int insert_item(buffer_item item)/将生产的产品放入缓冲区bufferin=item;printf("*insert缓冲池第%d号*n",in);inc(in);int remove_item(buffer_item *item)/从缓冲区内移走一个产品*item = bufferout;printf("*remove缓冲池第%d号*n",ou
7、t);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 = ran
8、d()%1000+1; printf("*生产产品%d*n",item);insert_item(item);printf("*解锁*n");printf("*第%d次生产结束*nn",num);pthread_mutex_unlock(&mutex);sem_post(&full);void *consumer(void *param)/消费者进程buffer_item item;int num = 0;while(1)sleep(rand()%(16-con_speed);printf("n*第%d次消费
9、*n",+num);printf("*等待full信号*n");sem_wait(&full);printf("*等待解锁*n");pthread_mutex_lock(&mutex);printf("*上锁,准备消费*n");remove_item(&item);pthread_mutex_unlock(&mutex);sem_post(&empty);printf("*消费产品%d*n",item);printf("*解锁*n");print
10、f("*第%d次消费结束*nn",num); int main()/主函数pthread_t tid1,tid2;pthread_attr_t attr1,attr2;srand(time(NULL);pthread_mutex_init(&mutex,NULL);/初始化sem_init(&empty,0,BUFFER_SIZE);sem_init(&full,0,0);in=0;out=0;printf("*n");printf("*开始!*n");printf("*n");printf
11、("生产者速度(1-15):n");scanf("%d",&pro_speed);printf("消费者速度(1-15):n");scanf("%d",&con_speed);pthread_attr_init(&attr1);pthread_create(&tid1,&attr1,producer,NULL);pthread_attr_init(&attr2);pthread_create(&tid2,&attr2,consumer,NULL);sl
12、eep(100);printf("*程序over*n");return 0;【实验步骤】编写程序代码gedit sx.c,再对代码进行编译gcc sx.c o sx lpthread,编译无错误,进行运行./sx,根据提示要求进行填写生产者和消费速度,观察消费者和生产者进程。【实验结果】【实验体会】1、Linux中生成线程方法: 第一种方式是用pthread 库来实现的,是在用户程序本身中实现线程,这实际上是对线程的一种模拟,线程之间的切换和调度是在用户的进程内部进行的,这种方式就被称为用户空间的线程。这种线程的好处是实现非常简单,性能也非常好,因为线程之间的切换都在用户进
13、程内部进行,切换开销比较小。缺点也非常明显,首先就是不能充分利用高端系统的SMP多处理器的优点,因为一个进程只能由一个处理器处理,第二点由于用户空间是在用户空间切换,某个线程遇到一个需要阻塞的系统调用进而就会造成这个进程被阻塞,因而所有线程被阻塞。 第二种方式是通过修改进程的实现方式来完成,可以使用不完全的进程创建方式创建共享数据空间的进程,在Linux下这种系统调用为clone()。2、Ptrtead生成线程: POSIX thread简称为pthread,Posix线程是POSIX标准线程该标准定义内部API创建和操纵线程。 数据类型 pthread_t:线程句柄 pthread_attr_t:线程属性 线程操纵函数(省略参数):pthread_create():创建一个线程 pthread_exit():终止当前线程 pthread_cancel():中断另外一个线程的运行 pthread_join(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高标准农田机械化种植模式创新
- 微流控纳米机器人-洞察及研究
- 慢性病风险预警-洞察及研究
- 土壤污染修复技术在土壤污染修复产业可持续发展能力中的应用效果与成本效益研究
- 2025个人商业房屋贷款委托贷款合同范本
- 人才培养体系优化-洞察及研究
- 动效设计心理学-洞察及研究
- 公路运输智慧监管下的异常行为预测与预警系统-洞察及研究
- 贵港覃塘三模数学试卷
- 河北春考数学试卷
- 2024年秋季新人教版八年级上册物理全册教案(2024年新教材)
- 内河航道例行养护工程预算编制规定及定额编制说明
- 2024年全国民政行业职业技能大赛(养老护理员赛项)备赛试题库及答案
- 英文绘本故事Brown.Bear.Brown.Bear.What.Do.You.See
- 2024-2029年中国驾驶舱监视系统行业市场现状供需分析及市场深度研究发展前景及规划战略投资分析研究报告
- 2024年社区工作者考试必背1000题题库必背(典型题)
- (正式版)JBT 7248-2024 阀门用低温钢铸件技术规范
- 关于垃圾分类的调查研究报告
- 静电对电子器件的影响与防护措施
- 简易借条模板
- 员工能力矩阵管理与培训总结
评论
0/150
提交评论