试验二进程线程地同步与互斥_第1页
试验二进程线程地同步与互斥_第2页
试验二进程线程地同步与互斥_第3页
试验二进程线程地同步与互斥_第4页
试验二进程线程地同步与互斥_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、实用实验二 进程(线程)的同步与互斥、实验目的.掌握基本的同步与互斥算法,理解生产者消费者模型。.学习使用 Windows中基本的同步对象,掌握相关API的使用方法。. 了解Windows中多线程的并发执行机制,实现进程的同步与互斥。二、实验内容.实验内容以生产者/消费者模型为依据,在Windows环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。.实验要求学习并理解生产者/消费者模型及其同步/互斥规则;学习了解 Windows同步对象及其特性;熟悉实验环境,掌握相关 API的使用方法;设计程序,实现生产者/消费者进程(线程)的同步与互斥;三、相

2、关API的功能及使用我们利用 Windows SDK提供的API编程实现实验题目要求,而VC中包含有 Windows SDK的所有工具和定义。要使用这些API,需要包含堆这些函数进行说明的SDK头文件一一最常见的是 Windows.h(特殊的API调用还需要包含其他头文件)。下面给出的是本实验使用到的API的功能和使用方法简单介绍。CreateThread功能一一创建一个在调用进程的地址空间中执行的线程 格式HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START

3、_ROUTINE lpStartAddress,LPVOID lpParamiter,文档实用DWORD dwCreationFlags,Lpdword IpThread );参数说明lpThreadAttributes指向一个 LPSECURITY_ATTRIBUTES(线程的安全性描述符)。dwStackSize定义原始堆栈大小。lpStartAddress 指向使用 LPTHRAED_START_ROUTIN型定义的函数。lpParamiter定义一个给进程传递参数的指针。dwCreationFlags定义控制线程创建的附加标志。lpThread保存线程标志符(32位)CreateMut

4、ex功能创建一个命名或匿名的互斥量对象格式HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);参数说明lpMutexAttributes必须取值 NULLbInitialOwner指示当前线程是否马上拥有该互斥量(即马上加锁)。lpName互斥量名称。CreateSemaphore功能一一创建一个命名或匿名的信号量对象格式HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,LON

5、G lInitialCount,LONG lMaximumCount,LPCTSTR lpName );参数说明lpSemaphoreAttributes必须取值 NULLlInitialCount信号量的初始值。该值大于等于 0,但小于等于lMaximumCount指定的最大值。lMaximumCount信号量的最大值。lpName信号量名称。WaitForSingleObject功能一一使程序处于等待状态,直到信号量hHandle出现(即其值大于0)或超过规定的等待时间格式DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseco

6、nds);参数说明hHandle信号量指针。文档dwMilliseconds等待的最长时间(INFINITE为无限等待)。实用ReleaseSemaphore 功能一一对指定信号量加上一个指定大小的量。成功执行则返回非0值格式BOOL ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, LPLONG lppreviousCount );参数说明hSemaphore信号量指针。lReleaseCount信号量的增量。lppreviousCount保存信号量当前值。ReleaseMutex功能一一打开互斥锁,即把互斥量加1。成功调用则返回

7、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)-seri

8、al;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); /延

9、迟等待/生产一个产品生产+ProductID 号产品成功.请求将产品 ProductID 投入缓冲将产品ProductID投入缓冲区中成cout生产者线程m_serial endl;cout生产者线程m_serial 区.endl;把新生产的产品放入缓冲区 g_bufferin = ProductID;in = (in+1)%SIZE_OF_BUFFER;Sleep(m_persist); / 操作等待 cout生产者线程m_serial 功.endl;/输出缓冲区当前的状态 cout*endn当前缓冲区情况如图(代表已有产品,口代表没有产品):endl;for (int i = 0;i0 )

10、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,

11、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;/消耗一个产品cout 消费者线程 m_serial 开始消费消费产品 ConsumeID.endl;Sleep(m_persist);cout消费者线程m_serial 消费产品ConsumeID 成功.endl;/输出缓冲区当前的状态c

12、out*1endln当前缓冲区情况如图:endl; for ( int i= 0;i0 )cout ;else cout 口;coutnn*n击 戋戋戈 dJm-l-T- # 费产产DzDe-bugshiiaie-frx&pi当前缓冲回情沉如图:口匚口口* D:Delbugshine.exe=1程程 线线缆缆缆线线纨 杳者者者者者者者 白产#wm;产产占电口罂盒 生生独独整道尸 iisw- 请清请请请取霜神区中成功D dbu*hi17W当著售售m3菖圄代表已有产品,口代表没有产品:JtJI * * * * Hi Pt RJW HPt JtJI = Ml * * H! Pt Pt冉 iMMsBh

13、费产产产霍生生戋戋戋戋者8 4-44成翟 品1A 产16投 品 H 费61产工 肖工挈II口 a -n 匚口 $广善将暹蚂一冲区中成功一口前缓冲区情况如图代表已有产品,口代表没有产品):生产者线 生产者统 in系统模煽束Pres:s eFiy key 七口 continiuiei.六、实验结果分析文档实用1、记录生产者和消费者的同步执行过程线程号线程类别延迟时间操作时间操作请求缓冲区请求生产(消费)结果1P12请求生产请求独占(在2前)生产成功2P26请求生产请求独占未生产3C45请求消费无未消费4C56请求消费无未消费5C32无无未消费2、分析Producer函数和Consumer函数的功能,并画出对应的程序流程图。Producer函数:通过用变量提取保存提取当前资源信息,然后判断是否执行,接着发出生产 请求,请求通过后独占缓冲区资源,接着生产一个产品投入缓冲区,成功后释放所占缓冲区资源,到此此函数执行完成。Consumer函数:也是通过用变量提取保存提取当前资源信息,然后判断是否执行,接着发出消费请求,请求通过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论