操作系统实验(二)线程的同步

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

-1-线程的同步姓名:蒙吉学号:20072411603实验名称:线程的同步实验目的:1)进一步掌握Windows系统环境下线程的创建与撤消。2)熟悉Windows系统提供的线程同步API。3)使用Windows系统提供的线程同步API解决实际问题。实验准备知识:1)等待一个对象:WaitForMultipleObject()用于等待一个对象。2)等待多个对象:WaitForMultipleObject()在指定时间内等待多个对象,等待的对象与WaitForSingleObject()相同。3)信号量对象:创建信号量CreateSemaphore();打开信号量OpenSemaphore()增加信号量Releasesemaphore()。实验内容:完成主、子两线程之间的同步,要求子线程先执行。在主线程中使用系统调用CreatThread()创建一个子线程,主线程创建了线程后进入阻塞状态,直到了线程运行完毕后唤醒主线程。实验要求:能正确使用等待对象WaitForMultipleObject()或WaitForSingleObject()及信号量对象:CreateSemaphore():OpenSemaphore:Releasesemaphore()等系统调用,进一步理解线程的同步。//Semaphore.cpp:definestheentrypointfortheconsoleapplecation.#includestdafx.h#includesemaphore1.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=_FILE_;#endif///////////////////////////////////////////////////////////////////////////////TheoneandonlyapplicationobjectCWinApptheApp;usingnamespacestd;staticHANDLEh1;staticHANDLEhHandle1=NULL;voidfunc();int_tmain(intargc,TCHAR*argv[],TCHAR*envp[]){intnRetCode=0;DWORDdwThreadID1;DWORDdRes,err;-2-hHandle1=CreateSemaphore(NULL,0,1,SemaphoreName1);//创建一个信号量if(hHandle1==NULL)printf(SemaphoreCreateFail!\n);elseprintf(SemaphoreCreateSuccess!\n);hHandle1=OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE,NULL,SemaphoreName1);if(hHandle1==NULL)printf(SemaphoreOpenFail!\n);elseprintf(SemaphoreOpenSuccess!\n);h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)func,(LPVOID)NULL,0,&dwThreadID1);//创建子线程if(h1==NULL)printf(Thread1createFail!\n);elseprintf(Thread1createSuccess!\n);dRes=WaitForSingleObject(hHandle1,INFINITE);//主线程等待了线程结束err=GetLastError();printf(WaitForSingleObjecterr=%d\n,err);if(dRes==WAIT_TIMEOUT)printf(TIMEOUT!dRes=%d\n,dRes);elseif(dRes==WAIT_OBJECT_0)printf(WAIT??_OBJECT!dRes=%d\n,dRes);elseif(dRes==WAIT_ABANDONED)printf(WAIT_ABANDONED!dRes=%d\n,dRes);elseprintf(dRes=%d\n,dRes);CloseHandle(h1);CloseHandle(hHandle1);ExitThread(0);returnnRetCode;}voidfunc(){BOOLrc;-3-DWORDerr;printf(NowInThread!\n);//子线程唤醒主线程rc=ReleaseSemaphore(hHandle1,1,NULL);err=GetLastError();printf(ReleaseSemaphoreerr=%d\n,err);if(rc==0)printf(SemaphoreReleaseFail!\n);elseprintf(SemaphoreReleaseSuccess!rc=%d\n,rc);}实验步骤:1)工程文件创建过程-4-2)对工程进行“设置”过程-5--6-3)classview底下状态4)fileview底下状态-7-5)实验结果实验总结:1)总的实验步骤和线程的创建和撤销的大致相同2)在实验一线程的创建和撤销的基础上进一步掌握了线程同步的实验过程以及具体步骤。-8-3)对等待一个对象【WaitForMultipleObject()】和等待多个对象【WaitForMultipleObject()】、创建信号量【CreateSemaphore()】、打开信号量【OpenSemaphore()】、增加信号量【Releasesemaphore()】等的调用方法有了较好的理解。4)了解了主线程和子线程同步过程中执行的先后顺序。先执行子线程,然后执行主线程。

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功