欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    实验四-同步与互斥-Linux实验报告(共10页).docx

    • 资源ID:13661264       资源大小:763.69KB        全文页数:10页
    • 资源格式: DOCX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    实验四-同步与互斥-Linux实验报告(共10页).docx

    精选优质文档-倾情为你奉上实验四 同步与互斥 【实验目的和要求】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 bufferBUFFER_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 < 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)     生产者结构进程 消费者结构进程【程序代码】/sx.c#include<stdio.h>#include<stdlib.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提供了对缓冲池访问的互斥要求sem_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",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次生产结束*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次消费*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次消费结束*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("生产者速度(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);sleep(100);printf("*程序over*n");return 0;【实验步骤】编写程序代码gedit sx.c,再对代码进行编译gcc sx.c o sx lpthread,编译无错误,进行运行./sx,根据提示要求进行填写生产者和消费速度,观察消费者和生产者进程。【实验结果】【实验体会】1、Linux中生成线程方法: 第一种方式是用pthread 库来实现的,是在用户程序本身中实现线程,这实际上是对线程的一种模拟,线程之间的切换和调度是在用户的进程内部进行的,这种方式就被称为用户空间的线程。这种线程的好处是实现非常简单,性能也非常好,因为线程之间的切换都在用户进程内部进行,切换开销比较小。缺点也非常明显,首先就是不能充分利用高端系统的SMP多处理器的优点,因为一个进程只能由一个处理器处理,第二点由于用户空间是在用户空间切换,某个线程遇到一个需要阻塞的系统调用进而就会造成这个进程被阻塞,因而所有线程被阻塞。 第二种方式是通过修改进程的实现方式来完成,可以使用不完全的进程创建方式创建共享数据空间的进程,在Linux下这种系统调用为clone()。2、Ptrtead生成线程: POSIX thread简称为pthread,Posix线程是POSIX标准线程该标准定义内部API创建和操纵线程。 数据类型 pthread_t:线程句柄 pthread_attr_t:线程属性 线程操纵函数(省略参数):pthread_create():创建一个线程 pthread_exit():终止当前线程 pthread_cancel():中断另外一个线程的运行 pthread_join():阻塞当前的线程,直到另外一个线程运行结束 pthread_attr_init():初始化线程的属性 pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)pthread_attr_getdetachstate():获取脱离状态的属性pthread_attr_destroy():删除线程的属性pthread_kill():向线程发送一个信号专心-专注-专业

    注意事项

    本文(实验四-同步与互斥-Linux实验报告(共10页).docx)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开