预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共12页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

______________________________________________________________________________________________________________精品资料实验四同步与互斥【实验目的和要求】1、掌握进程(线程)的同步与互斥。2、掌握生产者消费者问题的实现方法。3、掌握多线程编程方法。【实验内容】实现生产者消费者问题1、有一个仓库,生产者负责生产产品,并放入仓库,消费者会从仓库中拿走产品(消费)。2、仓库中每次只能入一个(生产者或消费者)。3、仓库中可存放产品的数量最多10个,当仓库放满时,生产者不能再放入产品。4、当仓库空时,消费者不能从中取出产品。5、生产、消费速度不同。【实验原理】信号量mutex提供对缓冲池访问的互斥要求并初始化为1,信号量empty和full分别用来表示空缓冲项和满缓冲项的个数,信号量empty初始化为n,信号量full初始化为0。2、定义如下结构及数据:定义缓冲区内的数据类型:typedefintbuffer_item;缓冲区:buffer_itembuffer[BUFFER_SIZE];对缓冲区操作的变量:intin,out;信号量mutex提供了对缓冲池访问的互斥要求:pthread_mutex_tmutex;信号量empty和full分别表示空缓冲顶和满缓冲顶的个数:sem_tempty,full;可以设定生产者的生产速度及消费者的消费速度:intpro_speed,con_speed;对缓冲区操作的自增函数:#defineinc(k)if(k<BUFFER_SIZE)k=k+1;elsek=03、并定义了如下实现问题的函数模块:将生产的产品放入缓冲区:intinsert_item(buffer_itemitem)从缓冲区内移走一个产品:intremove_item(buffer_item*item)生产者进程:void*producer(void*param)消费者进程:void*consumer(void*param)生产者结构进程消费者结构进程【程序代码】//sx.c#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<semaphore.h>#include<time.h>#defineinc(k)if(k<BUFFER_SIZE)k=k+1;elsek=0#defineBUFFER_SIZE10//缓冲区的大小typedefintbuffer_item;//定义缓冲区内的数据类型buffer_itembuffer[BUFFER_SIZE];//缓冲区intin,out;//对缓冲区操作的变量pthread_mutex_tmutex;//信号量mutex提供了对缓冲池访问的互斥要求sem_tempty,full;//信号量empty和full分别表示空缓冲顶和满缓冲顶的个数intpro_speed,con_speed;//可以设定生产者的生产速度及消费者的消费速度intinsert_item(buffer_itemitem){//将生产的产品放入缓冲区buffer[in]=item;printf("******insert缓冲池第%d号******\n",in);inc(in);}intremove_item(buffer_item*item){//从缓冲区内移走一个产品*item=buffer[out];printf("******remove缓冲池第%d号******\n",out);inc(out);}void*producer(void*param){//生产者进程buffer_itemitem;intnum=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);pthread_mutex_unlock(&mutex);sem_post(&full);}}void*consumer(v