ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:18.51KB ,
资源ID:9799798      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9799798.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统原理实验五.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统原理实验五.docx

1、操作系统原理实验五实验五 线程的同步1、实验目的(1)进一步掌握Windows系统环境下线程的创建与撤销。(2)熟悉Windows系统提供的线程同步API。(3)使用Windows系统提供的线程同步API解决实际问题。2、实验准备知识:相关API函数介绍1等待对象等待对象wait functions)函数包括等待一个对象WaitForSingleObject)和等待多个对象WaitForMultipleObject)两个API函数。b5E2RGbCAP1)等待一个对象WaitForSingleObject)用于等待一个对象。它等待的对象可以为以下对象之一。Change ontification

2、:变化通知。Console input: 控制台输入。Event:事件。Job:作业。Mutex:互斥信号量。Process:进程。Semaphore:计数信号量。Thread:线程。Waitable timer:定时器。原型:DWORD WaitForSingleObject( HANDLE hHandle, / 对象句柄 DWORD dwMilliseconds / 等待时间);参数说明:(1)hHandle:等待对象的对象句柄。该对象句柄必须为SYNCHRONIZE访问。(2)dwMilliseconds:等待时间,单位为ms。若该值为0,函数在测试对象的状态后立即返回,若为INFINI

3、TE,函数一直等待下去,直到接收到一个信号将其唤醒,如表2-1所示。p1EanqFDPw 返回值:如果成功返回,其返回值说明是何种事件导致函数返回。表2-1 函数描述访问描述WAIT ABANDONED等待的对象是一个互斥。 /等待对象的句柄为hHandlel,等待时间为10msDXDiTa9E3d2)等待对个对象WaitForMultiple)bject)在指定时间内等待多个对象,它等待的对象与WaitForSingleObject)相同。RTCrpUDGiT原型:DWORD WaitForMultipleObjectsDWORD nCount, /句柄数组中的句柄数CONST HANDLE

4、 * lpHandles, /指向对象句柄数组的指针BOOL fWaitAll, /等待类型DWORD dwMilliseconds /等待时间);参数说明:(1)nCount:由指针 * lpHandles指定的句柄数组中的句柄数,最大数是MAXIMUM WAIT OBJECTS。5PCzVD7HxA(2)* lpHandles:指向对象句柄数组的指针。(3)fWaitAll:等待类型。若为TRUE,当由lpHandles数组指定的所有对象被唤醒时函数返回;若为FALSE,当由lpHandles数组指定的某一个对象被唤醒时函数返回,且由返回值说明是由于哪个对象引起的函数返回。jLBHrnAI

5、Lg(4)dwMilliseconds:等待时间,单位为ms。若该值为0,函数测试对象的状态后立即返回;若为INFINITE,函数一直等待下去,直到接收到一个信号将其唤醒。xHAQX74J0X 返回值:、 如果成功返回,其返回值说明是何种事件导致函数返回。 各参数的描述如表2-2所示。表2-2 各参数描述访问描述WAIT OBJECT 0 toWAIT OBJECT 0nCount-1) 若bWaitAll为TRUE,返回值说明所有被等待的对象均被唤醒;若bWaitAll为FALSE,返回值减去WAIT OBJECT 0说明lpHandles数组下标指定的对象满足等待条件。如果调用时多个对象同

6、时被唤醒,则取多个对象中最小的那个数组下标WAIT ABANDONED 0 toWAIT ABANDONED 0nCount-1)若bWaitAll为TRUE,返回值说明所有被等待的对象均被唤醒,并且至少有一个对象是没有约束的互斥对象;若bWaitAll为FALSE,返回值减去WAIT ABANDONED 0说明lpHandles数组下标指定的没有约束的互斥对象满足等待条件WAIT TIMEOUT超时且参数bWaitAll指定的条件不能满足2信号量对象Semaphore)信号量对象Semaphore)包括创建信号量CreateSemaphore)、打开信号量OpenSemaphore)及增加信

7、号量的值ReleaseSemaphore)API函数。LDAYtRyKfE1)创建信号量CreateSemaphore)用于创建一个信号量。原型:HANDLE CreateSemaphore(LPSECURITY ATTRIBUTES lpSemaphoreAttributes, /安全属性Zzz6ZB2LtkLONG lInitialCount, /信号量对象的初始值dvzfvkwMI1LONG lMaximumCount, /信号量的最大值rqyn14ZNXILPCTSTR lpName /信号量名EmxvxOtOco);参数说明:1)lpSemaphoreAttributes:指定安全属

8、性,为NULL时,信号量得到一个默认的安全描述符。(2)lInitialCount:指定信号量对象的初始值。该值必须大于等于0,小于等于lMaximumCount。当其值大于0时,信号量被唤醒。当该函数释放了一个等待该信号量的线程时,lInitialCount值减1,当调用函数ReleaseSemaphore)时,按其指定的数量加一个值。SixE2yXPq5(3)lMaximumCount:指出该信号量的最大值,该值必须大于0。(4)lpName:给出信号量的名字。返回值:信号量创建成功,将返回该信号量的句柄。如果给出的信号量名是系统已经存在的信号量,将返回这个已存在信号量的句柄。如果失败,系

9、统返回NULL,可以调用函数GetLastError)查询失败的原因。6ewMyirQFL用法举例:Static HANDLE hHandlel= NULL; /定义一个句柄/创建一个信号量,其初始值为0,最大值为5,信号量的名字为“SemphoreNamel”HHandle=CreateSemaphoreNULL,0,5,“SemphoreNamel”);2)打开信号量OpenSemaphore)用于打开一个信号量。原型: HANDLE OpenSemaphoreDWORD dWDesiredAccess, /访问标志BOOL bInheritHandle, /继承标志LPCTSTR lpN

10、ame /信号量名);参数说明:(1)dwDesiredAccess:指出打开后要对信号量进行何种访问,如表2-3所示。表2-3 访问状态访问描述SEMAPHORE ALL ACCESS可以进行任何对信号量的访问SEMAPHORE MODIFY STATE可使用ReleaseSemaphore)修改信号量的值,使信号量成为可用状态SYNCHRONIZE使用等待函数wait functions),等待信号量成为可用状态2)bInheritHandle:指出返回的信号量句柄是否可以继承。3)lpName:给出信号量的名字。返回值:信号量打开成功,将返回该号量的句柄;如果失败,系统返回NULL,可以

11、调用函数GetLastError)查询失败的原因。kavU42VRUs用法举例:static HANDLE hHandlel= NULL ;/打开一个名为“SemphoreNamel”的信号量,之后可使用ReleaseSemaphore)函数增加信号量的值hHandlel= OpenSemaphoreSEMAPHORE MODIFY STATE,NULL,“SemphoreNamel”);y6v3ALoS893)增加信号量的值 ReleaseSemaphore)用于增加信号量的值。原型:BOOL ReleaseSemaphoreHANDLE hSemaphore, /信号量对象句柄LONG l

12、ReleaseCount, /信号量要增加数值LPLONG lpPreviousCount /信号量要增加数值的地址);参数说明:(1)hSemaphore:创建或打开信号量时给出的信号量对象句柄。Windows NT中建议要使用SEMAPHORE MODIFY STATE访问属性打开该信号量。M2ub6vSTnP(2)IReleaseCount:信号量要增加的数值。该值必须大于0。如果增加该值后,大于信号量创建时给出的lMaximumCount值,则增加操作失效,函数返回FALSE。0YujCfmUCw(3)LpPreviousCounte:接收信号量值的一个32位的变量。若不需要接收该值,

13、可以指定为NULL。eUts8ZQVRd返回值:如果成功,将返回一个非0值;如果失败,系统返回0,可以调用函数GetLastError。 /给信号量的值加13、实验内容完成主、子两个线程之间的同步,要求子线程先执行。在主线程中使用系统调用GreateThread)创建一个子线程。主线程创建子线程后进入阻塞状态,直到子线程运行完毕后唤醒主线程。GMsIasNXkA4、实验要求能正确使用等待对象WaitForSingleObject)或WaitForMultipleObject)及信号量对象CreateSemaphore)、OpenSemaphore)、ReleaseSemaphore)等系统调用

14、,进一步理解线程的同步。TIrRGchYzg5、实验指导具体操作过程:在MicrosoftVisual C+ 6.0环境下建立一个MFC支持的控制台工程文件,编写C程序,在程序中使用CreateSemaphoreNULL,0,1,“SemaphoreNamel”)创建一个名为“SemaphoreNamel”的信号量,信号量的初始值为0,之后使用0penSemaphore等待该信号量及使用ReleaseSemaphore)释放该信号量,然后创建一个子线程,主线程创建子线程后调用WaitForSingleObjecthHandlel,INFINITE),这里等待时间设置为INFINITE表示要一直等待下去,直到该信号量被唤醒为止。子线程结束,调用ReleaseSemaphorehHandlel,1,NULL)释放信号量,使信号量的值加1。7EqZcWLZNX6、实验总结该实验完成了主、子线程的同步,主线程创建子线程后,主线程阻塞,让子线程先执行,等子线程执行完毕后,由子线程唤醒主线程。lzq7IGf02E7、实验展望上面的程序完成了主、子两个线程执行先后顺序的同步关系,思考以下问题。(1)如何实现多个线程的同步?(2)若允许子线程执行多次后主线程再执行,又如何设置信号量的初值?(3)8、申明:9、所有资料为本人收集整理,仅限个人学习使用,勿做商业用途。(1)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1