实验四-同步与互斥-Linux实验报告(共10页)_第1页
实验四-同步与互斥-Linux实验报告(共10页)_第2页
实验四-同步与互斥-Linux实验报告(共10页)_第3页
实验四-同步与互斥-Linux实验报告(共10页)_第4页
实验四-同步与互斥-Linux实验报告(共10页)_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论