欢迎来到天天文库
浏览记录
ID:55173951
大小:759.14 KB
页数:10页
时间:2020-04-30
《实验四-同步与互斥-Linux实验报告.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验四同步与互斥【实验目的和要求】1、掌握进程(线程)的同步与互斥。2、掌握生产者消费者问题的实现方法。3、掌握多线程编程方法。【实验内容】实现生产者消费者问题1、有一个仓库,生产者负责生产产品,并放入仓库,消费者会从仓库中拿走产品(消费)。2、仓库中每次只能入一个(生产者或消费者)。3、仓库中可存放产品的数量最多10个,当仓库放满时,生产者不能再放入产品。4、当仓库空时,消费者不能从中取出产品。5、生产、消费速度不同。【实验原理】1、信号量mutex提供对缓冲池访问的互斥要求并初始化为1,信号量empty和full分别用来表示空缓冲项和满缓
2、冲项的个数,信号量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,
3、con_speed;对缓冲区操作的自增函数:#define inc(k) if(k < BUFFER_SIZE) k = k+1;else k=03、并定义了如下实现问题的函数模块: 将生产的产品放入缓冲区: int insert_item(buffer_item item) 从缓冲区内移走一个产品: int remove_item(buffer_item *item) 生产者进程 :void *producer(void *param) 消费者进程:void *consumer(void *param)
4、 生产者结构进程消费者结构进程【程序代码】//sx.c#include#include#include#include#include#defineinc(k)if(k5、缓冲区操作的变量pthread_mutex_tmutex;//信号量mutex提供了对缓冲池访问的互斥要求sem_tempty,full;//信号量empty和full分别表示空缓冲顶和满缓冲顶的个数intpro_speed,con_speed;//可以设定生产者的生产速度及消费者的消费速度intinsert_item(buffer_itemitem){//将生产的产品放入缓冲区buffer[in]=item;printf("******insert缓冲池第%d号******",in);inc(in);}intremove_item(bu6、ffer_item*item){//从缓冲区内移走一个产品*item=buffer[out];printf("******remove缓冲池第%d号******",out);inc(out);}void*producer(void*param){//生产者进程buffer_itemitem;intnum=0;while(1){sleep(rand()%(16-pro_speed));printf("******第%d次生产******",++num);printf("******等待empty信号******");sem_wa7、it(&empty);printf("******等待解锁******");pthread_mutex_lock(&mutex);printf("******上锁,准备生产******");item=rand()%1000+1;printf("******生产产品%d*******",item);insert_item(item);printf("*******解锁******");printf("******第%d次生产结束*******",num);pthread_mutex_unlock(&mutex);sem_8、post(&full);}}void*consumer(void*param){//消费者进程buffer_itemitem;intnum=0;while(1){s
5、缓冲区操作的变量pthread_mutex_tmutex;//信号量mutex提供了对缓冲池访问的互斥要求sem_tempty,full;//信号量empty和full分别表示空缓冲顶和满缓冲顶的个数intpro_speed,con_speed;//可以设定生产者的生产速度及消费者的消费速度intinsert_item(buffer_itemitem){//将生产的产品放入缓冲区buffer[in]=item;printf("******insert缓冲池第%d号******",in);inc(in);}intremove_item(bu
6、ffer_item*item){//从缓冲区内移走一个产品*item=buffer[out];printf("******remove缓冲池第%d号******",out);inc(out);}void*producer(void*param){//生产者进程buffer_itemitem;intnum=0;while(1){sleep(rand()%(16-pro_speed));printf("******第%d次生产******",++num);printf("******等待empty信号******");sem_wa
7、it(&empty);printf("******等待解锁******");pthread_mutex_lock(&mutex);printf("******上锁,准备生产******");item=rand()%1000+1;printf("******生产产品%d*******",item);insert_item(item);printf("*******解锁******");printf("******第%d次生产结束*******",num);pthread_mutex_unlock(&mutex);sem_
8、post(&full);}}void*consumer(void*param){//消费者进程buffer_itemitem;intnum=0;while(1){s
此文档下载收益归作者所有