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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

012244信安1401杨紫淇 计算机操作系统22Word下载.docx

1、行完毕后唤醒主线程。3. 实验要求:能正确使用等待对象、WaitForSingleObject()或WaitForMultipleObject(0 及信号量对象CreateSemaphore()、OpenSemaphore()、ReleaseSemaphore()等系统调用,进一步理解线程的同步。4. 实验准备:相关API 函数介绍5. 试验指导:具体操作过程同本章实验一,在Microsoft visual C+6.0 环境下建立一个MFC 支持的控制台文件,编写C 程序,在程序中使用CreateSemaphore(NULL,0,1,”SemaphoreName1”)创建一个名为“Semaph

2、oreName1”的信号量,信号量的初始值为0,之后使用OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STARTE,NULL, ”SemaphoreName1)打开该信号量,这里访问标志使用“ SYNCHRONIZE|SEMAPHORE_MODIFY_STARTE ”, 以便之后可以使用WaitForSingleObject()等待该信号量及使用ReleaseSemaphore()释放该信号量,然后创建一个子线程,主线程创建子线程后调用WaitForSingleObject(hHandle1,INFINITE),这里等待时间设置为INFINITE 表示一

3、直等待下去,直到该信号量被唤醒为止。子线程结束,调用ReleaseSemaphore(hHandle1,1,NULL)释放信号量,使信号量的值加1。6. 实验过程:7. 实验总结:实验完成了主、子线程的同步,主线程创建子线程后,主线程塞,让子线程先执行,等子线程执行完后, 由子线程唤醒子线程。主子线程运行情况如图:主、子线程的运行情况说明:1. 实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;2. 实验准备由学生在实验或上机之前填写,教师应该在实验前检查;3. 实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;4.

4、实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;5. 源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。源程序:/ Thread.cpp : Defines the entry point for the console application.#include stdafx.hThread.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ The one and only application objectCWinApp

5、 theApp;using namespace std;void ThreadName()printf(Thread is Running!n);static HANDLE hHandle1=NULL;DWORD ThreadID1;int _tmain(int argc, TCHAR* argv, TCHAR* envp) int nRetCode = 0;hHandle1=CreateThread(LPSECURITY_ATTRIBUTES) NULL,0,(LPTHREAD_START_ROUTINE) ThreadName,(LPVOID)NULL,&ThreadID1);Sleep(

6、5000);CloseHandle(hHandle1);ExitThread(0);return nRetCode; / initialize MFC and print and error on failure if (!AfxWinInit(:GetModuleHandle(NULL), NULL, :GetCommandLine(), 0) / TODO: change error code to suit your needs cerr _T(Fatal Error: MFC initialization failed) endl; nRetCode = 1; else code yo

7、ur applications behavior here. CString strHello; strHello.LoadString(IDS_HELLO); cout (LPCTSTR)strHello return nRetCode;void ThreaName1()printf(!【注意】:文件的路径一定是能够匹配的。【基础知识】:(1)lpThreadAttributes:为线程指定安全属性.为NULL 时,线程得到一个默认的安全描述符.(2)dwStackSize:线程堆栈的大小.其值为0 时,其大小与调用该线程的线程堆栈大小相同.(3)lpStartAddress:指定线程要执行

8、的函数.(4)lpparameter:函数中要传递的参数.(5)dwCreationFlags:指定线程创建后所处的状态.若为CRRATE_SUSPENDED,表示创建后出于挂起状态,用ResumeThread()激活线程才可以执行.若该值为0,表示线程创建后立即执行.(6)lpThreadId:用一个32 位的变量接受系统返回的线程标识符.若该值设为NULL,系统不返回线程标识符.2.2 线程的同步/ Semaphore.cpp :#includeSemaphore.hstatic HANDLE h1; /线程句柄 /信号量句柄void func();int nRetCode = 0;DWO

9、RD dwThreadID1;DWORD dRes,err;hHandle1=CreateSemaphore(NULL,0,1,SemaphoreName1/创建一个信号量if (hHandle1=NULL) printf(Semaphore Create!else printf(Semaphore Create Success!hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,NULL,/打开信号量Semaphore Open Fail!Semaphore Open Success!h1=CreateThread(LPSECU

10、RITY_ATTRIBUTES)NULL,(LPTHREAD_START_ROUTINE)func,0,&dwThreadID1);/创建子进程if (h1=NULL) printf(Thread1 create Fail!Thread1 create Success!dRes=WaitForSingleObject(hHandle1,INFINITE);/ 主线程等待子线程结束err=GetLastError();WaitForSingleObject err = %dn,err);if (dRes=WAIT_TIMEOUT) printf(TIMEOUT!dRes=%dn,dRes);el

11、se if (dRes=WAIT_OBJECT_0) printf(WAIT_OBJECT!else if (dRes=WAIT_ABANDONED)WAIT_ABANDONED!Dres=%dndRes =%dnCloseHandle(h1);void func()BOOL rc;DWORD err;Now In Thread!rc =ReleaseSemaphore(hHandle1,1,NULL);err =GetLastError();ReleaseSemaphore err=%dnif(rc=0) printf(Semaphore Release Fail!Semaphore Rel

12、ease Success!rc= %dn,rc);运行情况:等待对象(wait fuctions)函数包括等待一个对象(WaitForSingleObject()和等待多对象(WaitForMultipleObject()两个API 函数。等待一个对象WaitForMultipleObject()用于等待一个对象。他等待的对象可以为以下对象之一。Change notification:变化通知。Console input:控制台输入。Events:事件。Job:作业。Mutex:互斥信号量。Process:进程。Semaphore:计数信号量。Thread:线程。Waitable timer:

13、定时器。原型:DWORD WaitForSingleObject(HANDLE hHandle, /对象句柄DWORD dwMilliseconds /等待时间);参数说明:hHandle:等待对象的对象句柄。该对象句柄必须为SYNCHRONIZE 访问。dwMilliseconds:等待时间,单位为ms。若改值为0,函数在测试对象的状态后立即返回,若为INFINITE,函数一直等待下去,直到收到一个信号将其唤醒,如表21 所示。返回值:如果返回成功,其返回值说明是何种事件导致函数返回。表21 函数描述访问 描述WAIT_ABANDONED 等待对象的是一个互斥(mutex)对象,该互斥对象没

14、有被拥有它的线程释放,他被设置为不能被唤醒WAIT_OBJECT_0 指定对象被唤醒WAIT_TIMEOUT 超时用法举例:Staitic HANDLE hHandle1=NULL;DWORD dRes;dRes=WaitForSingleObject(hHandle1, 10); /等待对象的句柄为hHandle,等待时间为1000ms等待多个对象WaitForMultipleObject ( ) 在指定时间内等待多个对象, 他等待的对象与WaitForSingleObject()相同。DWORD WaitForMultipleObject(DWORD nCount, /句柄数组中的句柄数X

15、ONST HANDLE *lpHandles, /指向对象句柄数组的指针BOOL fWaitAll, /等待类型参数说明:nCount: 由指针*lpHandles 指定的句柄数组中的句柄数, 最大数是MAXIMUM_WAIT_OBJECTS。*lpHandles:指向对象句柄数组的指针。fWAitAll:等待类型。若存为true,当由lpHandles 数组指定的所有对象被唤醒时函数返回;若为FALSE,当由lpHandles 数组制定的某一个对象被唤醒时函数返回,且有返回值说明事由哪个对象引起的函数返回。dwMilliseconds :等待时间。单位为ms。若该值为0,函数测试对象的状态后

16、立即返回;若为INFINITE,函数一直等待下去,直到收到一个信号将其唤醒。如果成功返回,其返回值说明是何种事件导致函数返回。各参数的描述如表22 所示。表22 各参数描述WAIT_OBJECT_0 to (WAIT_OBJECT 若bWaitAll 为TRUE,返回值说明所有被等待的对象均被唤醒;若_0+nCount1) bWaitAll 为FALSE。返回值减去WAIT_OBJECT_0 说明lpHandles 数组下标指定的对象满足等待条件。如果调用时多个对象同时被唤醒,则取多个对象中最小的那个数组下标WAIT_ABANDONED_0 to 若bWaitAll 为TRUE,返回值说明所有

17、被等带的对象均被唤醒,并且(WIAT_ABANDONED0+NcOUNT1) 至少有一个对象是没有约束的互斥对象;若bWaitAll为FALSE,返回值减去WAIT_ABANDONED_0 说明lpHandles 数组下标指定的没有约束的互斥对象满足等待条件WAIT_TIMNEOUT 超时且参数bWaitAll 指定的条件不能满足信号量对象(semaphore)信号量对象(semaphore)包括创建信号量(CreateSemaphore()打开信号量OpenSemaphore()及增加信号量的值(ReleaseSemaphore()函数。创建信号量CreateSemaphore()用于创建一

18、个信号量。HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,/安全属性LONG lInitialCount, /信号量对象初始值LONG liMaximumCount, /信号量最大值LPCTSTR lpName /信号量名lpSemaphoreAttributes:指定安全属性,为null 是,信号量得到一个默认的安全描述符。lInitialCount : 指定信号量对象的初始值。该值必须大于等于0 , 小于等于lMaximumCount 。当其值大于0 是,信号量被唤醒。当该函数释放了一个等待该信号量的线程

19、时,lInitialCount 值减1,当调用函数ReleaseSemaphore()时,按其指定的数量加一个值。lMaximumCount:指出该信号量的最大值,该值必须大于0.lpName:给出该信号量的名字。信号量创建成功,将返回该型号量的句柄。如果给出的信号量名是系统已经存在的信号量,将返回这个已经存在的信号量的句柄。如果失败,系统返回null,还可以调用函数GEtLastError()查询失败的原因。Static HANDLE hHandle1=null;/创建一个信号量,其初值为0,最大值为5,信号量的名字为“SemphoreName1”hHnadle1= CreateSemaph

20、ore(NULL,SemphoreName1);打开信号量OpenSemaphore()用于打开一个信号量。HANDLE OpenSemaphore(DWORD dwDesidedAccess, /访问标志BOOL bInheritHandle, /继承标志LPCTSTR lpNme /信号量名(1).dwDesiredAccess:指出打开后要对信号量进行何种访问,如表所示。表 23 访问状态SEMAPHORE_ALL_ACCESS 可以进行任何对信号量的访问SEMPHORE_MODFIY_STATE 可以使用ReleaseSemaphore()修改信号量的值,使信号量的值成为可用状态SYN

21、CHRONIZE 使用等待函数(wait functions),等待信号量成为可用状态(). bInheritHandle:指出返回的的信号量句柄是否可以继承。().lpName:给出信号量的名字信号量打开成功,将返回信号量的句柄;如果失败,系统返回null,可以调用函数GetLastError()查询失败的原因。;/打开一个名为 ” SemphoreName1 ” 的信号量,之后可使用ReleaseSemaphore()函数增加信号量的值hHandle1=OpenSemaphore ( SEMAPHORE_MOFDIFY_START,NULL, ”SemphoreName1” );3. 增加

22、信号量的值ReleaseSemaphore()用于增加信号量的值。BOOL ReleaseSemaphore(HANDLE hSemaphore, /信号量对象句柄LONG lReleaseCount, /信号量要增加数值LPLONG lpPreiousCount /信号量要增加数值地址(1).hSemaphore:创建或打开信号量时给出的信号量对象句柄。Windows NT 中建议使用SEMAPHORE_MODIFY_STARTE 访问属性打开该信号量。(2). lReleaseCount:信号量要增加数值。该值必须大于0。如果增加该值后大于信号创建时给出的lMaximumCount 值,则增加操作失效,函数返回FALSE。(3). lpPreiousCount :接收信号量的一个32 位的一个变量。若不需要接受该值,可以指定为null。如果成功,将返回一个非0 值;如果失败,系统返回一个0,可以调用一个GetLastError()查询失败的原因。Static HANDLE hHandle1=NULL;BOOL rc;rc= ReleaseSemaphore(hHandle1,1,NULL);/给信号量的值加1;

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

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