实验四-同步与互斥-Linux实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四同步与互斥
【实验目的和要求】
1、掌握进程(线程)的同步与互斥。
2、掌握生产者消费者问题的实现方法。
3、掌握多线程编程方法。
【实验内容】
实现生产者消费者问题
1、有一个仓库,生产者负责生产产品,并放入仓库,消费者会从仓库中拿走产品(消费)。
2、仓库中每次只能入一个(生产者或消费者)。
3、仓库中可存放产品的数量最多10个,当仓库放满时,生产者不能再放入产品。
4、当仓库空时,消费者不能从中取出产品。
5、生产、消费速度不同。
【实验原理】
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 3、并定义了如下实现问题的函数模块: 将生产的产品放入缓冲区:int insert_item(buffer_item item) 从缓冲区内移走一个产品:int remove_item(buffer_item*item) 生产者进程:void*producer(void*param) 消费者进程:void*consumer(void*param) 生产者结构进程消费者结构进程 【程序代码】 //sx.c #include #include #include #include #include #define inc(k) if(k #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); 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次消费*****\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"); printf("******第%d次消费结束*******\n\n",num); } }