预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

线程的互斥 姓名:蒙吉学号:20072411603 实验名称:线程的互斥 实验目的:1)熟练掌握Windows系统环境下线程的创建于撤销。 2)熟悉Windows系统提供的线程互斥API。 3)使用Windows系统提供的线程互斥API解决实际问题。 实验准备知识: 临界区对象(Criticalsection)包括初始化临界区InitializecritiCalSection()、进入临界区EnterCriticalSection()、退出临界区LeaveCriticalSection()及删除临界区DeleteCriticalsection等API函数;互斥对象(Mutex)包括创建互斥对象(CreateMutex())、打开互斥对象(OpenMutex())、释放互斥条件(ReleaseMutex())API函数。 实验内容: 完成两个子线程之间的互斥,在主线程中使用系统调用CreateThread()创建两个子线程,并使两个子线程互斥的使用全局变量count。 实验要求: 能正确使用临界区对象,包括初始化临界区InitializecritiCalSection()、进入临界区EnterCriticalSection()、退出临界区LeaveCriticalSection()及删除临界区DeleteCriticalsection(),进一步理解线程的互斥。 源代码: //操作系统实验三.cpp:Definestheentrypointfortheconsoleapplication. // #include"stdafx.h" #include"操作系统实验三.h" #ifdef_DEBUG #definenewDEBUG_NEW #undefTHIS_FILE staticcharTHIS_FILE[]=__FILE__; #endif ///////////////////////////////////////////////////////////////////////////// //Theoneandonlyapplicationobject CWinApptheApp; usingnamespacestd; staticintcount=5; staticHANDLEh1; staticHANDLEh2; LPCRITICAL_SECTIONhCriticalSection;//定义指向临界区对象的地址指针 CRITICAL_SECTIONCritical;//定义临界区 voidfunc1(); voidfunc2(); int_tmain(intargc,TCHAR*argv[],TCHAR*envp[]) { intnRetCode=0; DWORDdwThreadID1,dwThreadID2; hCriticalSection=&Critical;//将指向临界区的对象的指针指向临界区 InitializeCriticalSection(hCriticalSection);//初始化临界区 h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)func1, (LPVOID)NULL, 0,&dwThreadID1);//创建线程func1 if(h1==NULL)printf("Thread1createFail!\n"); elseprintf("Thread1createsuccess!\n"); h2=CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)func2, (LPVOID)NULL, 0,&dwThreadID2);//创建线程func2 if(h1==NULL)printf("Thread2createFail!\n"); elseprintf("Thread2createsuccess!\n"); _sleep(1000); CloseHandle(h1); CloseHandle(h2); DeleteCriticalSection(hCriticalSection);//删除临界区 ExitThread(0); returnnRetCode; } voidfunc2() { intr2; EnterCriticalSection(hCriticalSection);//进入临界区 r2=count; _sleep(100); r2=r2+1; count=r2; prin