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

    实验二-进程(线程)的同步与互斥(7页).doc

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

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

    实验二-进程(线程)的同步与互斥(7页).doc

    -第 1 页实验二-进程(线程)的同步与互斥-第 2 页实验二 进程(线程)的同步与互斥一、实验目的1 掌握基本的同步与互斥算法,理解生产者消费者模型。2 学习使用 Windows 中基本的同步对象,掌握相关 API 的使用方法。3 了解 Windows 中多线程的并发执行机制,实现进程的同步与互斥。二、实验内容1 实验内容以生产者/消费者模型为依据,在 Windows 环境下创建一个控制台进程,在该进程中创建 n 个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。Buffer(共享内存)生产者消费者2 实验要求 学习并理解生产者/消费者模型及其同步/互斥规则;学习了解 Windows 同步对象及其特性;熟悉实验环境,掌握相关 API 的使用方法;设计程序,实现生产者/消费者进程(线程)的同步与互斥;三、相关 API 的功能及使用我们利用 Windows SDK 提供的 API 编程实现实验题目要求,而 VC 中包含有 WindowsSDK 的所有工具和定义。要使用这些 API,需要包含堆这些函数进行说明的 SDK 头文件最常见的是 Windows.h(特殊的 API 调用还需要包含其他头文件)。下面给出的是本实验使用到的 API 的功能和使用方法简单介绍。(1)CreateThread 功能创建一个在调用进程的地址空间中执行的线程 格式HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParamiter,DWORD dwCreationFlags,Lpdword lpThread);参数说明-第 3 页lpThreadAttributes指向一个 LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。dwStackSize定义原始堆栈大小。lpStartAddress指向使用 LPTHRAED_START_ROUTINE 类型定义的函数。lpParamiter定义一个给进程传递参数的指针。dwCreationFlags定义控制线程创建的附加标志。lpThread保存线程标志符(32 位)(2)CreateMutex 功能创建一个命名或匿名的互斥量对象 格式HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);参数说明lpMutexAttributes必须取值 NULL。bInitialOwner指示当前线程是否马上拥有该互斥量(即马上加锁)。lpName互斥量名称。(3)CreateSemaphore 功能创建一个命名或匿名的信号量对象 格式HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LONG lInitialCount,LONG lMaximumCount,LPCTSTR lpName);参数说明lpSemaphoreAttributes必须取值 NULL。lInitialCount信号量的初始值。该值大于等于 0,但小于等于 lMaximumCount 指定的最大值。lMaximumCount信号量的最大值。lpName信号量名称。(4)WaitForSingleObject 功能使程序处于等待状态,直到信号量 hHandle 出现(即其值大于 0)或超过规定的等待时间 格式DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);参数说明hHandle信号量指针。dwMilliseconds等待的最长时间(INFINITE 为无限等待)。(5)ReleaseSemaphore 功能对指定信号量加上一个指定大小的量。成功执行则返回非 0 值 格式-第 4 页BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lppreviousCount);参数说明hSemaphore信号量指针。lReleaseCount信号量的增量。lppreviousCount保存信号量当前值。(6)ReleaseMutex 功能打开互斥锁,即把互斥量加 1。成功调用则返回 0 格式BOOL ReleaseMutex(HANDLE hMutex);参数说明hMutex互斥量指针。四、示例程序/定义一个结构体用于存储线程的信息struct ThreadInfoint serial;/线程号char entity;/线程类别(生产者或消费者)double delay;/等待时间double persist;/操作时间/生产者void Producer(void*p)/定义变量用于存储当前线程的信息DWORD m_delay;DWORD m_persist;int m_serial;/从参数中获得信息m_serial=(ThreadInfo*)(p)-serial;m_delay=(DWORD)(ThreadInfo*)(p)-delay*INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)-persist*INTE_PER_SEC);while(running)/P 操作cout生产者线程 m_serial 请求生产.endl;WaitForSingleObject(g_hEmptySemaphore,INFINITE);cout生产者线程 m_serial 请求独占缓冲区.endl;WaitForSingleObject(g_hMutex,INFINITE);Sleep(m_delay);/延迟等待/生产一个产品cout生产者线程m_serial 生产+ProductID 号产品成功.endl;-第 5 页cout生产者线程m_serial 请求将产品ProductID 投入缓冲区.endl;/把新生产的产品放入缓冲区g_bufferin=ProductID;in=(in+1)%SIZE_OF_BUFFER;Sleep(m_persist);/操作等待cout生产者线程 m_serial 将产品 ProductID 投入缓冲区中成功.endl;/输出缓冲区当前的状态cout*endln 当前缓冲区情况如图(代表已有产品,代表没有产品):endl;for(int i=0;i0)cout;else cout;coutnn*nserial;m_delay=(DWORD)(ThreadInfo*)(p)-delay*INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)-persist*INTE_PER_SEC);while(running)/P 操作cout消费者线程 m_serial 请求消费.endl;WaitForSingleObject(g_hFullSemaphore,INFINITE);cout消费者线程 m_serial 请求独占缓冲区.endl;WaitForSingleObject(g_hMutex,INFINITE);Sleep(m_delay);/延迟等待/从缓冲区中取出一个产品cout消费者线程 m_serial 请求取出一个产品.endl;ConsumeID=g_bufferout;g_bufferout=0;out=(out+1)%SIZE_OF_BUFFER;cout消费者线程 m_serial 取出产品 ConsumeID 成功.endl;-第 6 页/消耗一个产品cout 消 费 者 线 程m_serial开 始 消 费 消 费 产 品ConsumeID.endl;Sleep(m_persist);cout消费者线程 m_serial 消费产品 ConsumeID 成功.endl;/输出缓冲区当前的状态cout*endln 当前缓冲区情况如图:endl;for(int i=0;i0)cout;else cout;coutnn*nendl;/V 操作ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL);五、实验结果六、实验结果分析1、记录生产者和消费者的同步执行过程2、分析 Producer 函数和 Consumer 函数的功能,并画出对应的程序流程图。Producer 函数:通过用变量提取保存提取当前资源信息,然后判断是否执行,接着发出生产请求,请求通过后独占缓冲区资源,接着生产一个产品投入缓冲区,成功后释放所占缓冲区资源,到此此函数执行完成。Consumer 函数:也是通过用变量提取保存提取当前资源信息,然后判断是否执行,接着发出消费请求,请求通过后独占缓冲区资源,接着消费一个产品取出缓冲区,成功后释放所占缓冲区资源,到此此函数执行完成。线程号线程号线程类别线程类别延迟时间延迟时间操作时间操作时间操作请求操作请求缓冲区请求缓冲区请求生产(消费)结果生产(消费)结果1P12请求生产请求独占(在 2 前)生产成功2P26请求生产请求独占未生产3C45请求消费无未消费4C56请求消费无未消费5C32无无未消费-第 7 页Producer 函数:Consumer 函数:3、试将同步和互斥的 P 操作颠倒次序执行,观察并分析程序的运行情况。答:程序产生死锁。程序无法正常运行下去,因为同步和互斥的 P 操作颠倒次序,即先独占缓冲区资源,后发送请求,因为先独占缓冲区资源,若生产(消费)请求无法通过则一直等待,无法释放资源,因而程序死锁,无法运行了。

    注意事项

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

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




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

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

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

    收起
    展开