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

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

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

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

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

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

上海电力学院 计算机操作系统原理 实验报告 题目:线程的同步 院系:计算机科学与技术学院 专业年级:信息安全2010级 学生姓名:李鑫学号:20103277 同组姓名:无 2012年11月13日 上海电力学院 实验报告 课程名称计算机操作系统原理实验项目线程的同步 姓名李鑫学号20103277班级2010251班专业信息安全 同组人姓名无指导教师姓名徐曼实验日期2012/11/13 实验目的和要求: 1、进一步掌握Windows系统环境下线程创建与撤销。 2、熟悉Windows系统提供的线程互斥API。 3、使用Windows系统提供的线程互斥API解决实际问题。 实验原理与内容 完成两个子线程之间的互斥。在主线程中使用系统调用CreateThread()创建两个子线程,并使两个子线程互斥地使用全局变量count。 实验平台与要求 能正确使用临界区对象,包括初始化临界区InitializeCriticalSection()、进入临界区EnterCriticalSection()、退出临界区LeaveCriticalSection()及删除临界区DeleteCriticalSection(),进一步理解线程的互斥。 操作系统:Windows2000或WindowsXP 实验平台:VisualStudioC++6.0 实验步骤与记录 启动安装好的VisualC++6.0。 选择File->New,新建Win32ConsoleApplication控制台程序。 由于CreateThread()等函数是MicrosoftWindows操作系统的系统调用,因此选择AnapplicationthatsupportsMFC,之后单击Finish按钮。 打开编辑环境后,编辑程序,并且编译、链接并运行该程序。 实验分析与结论 本实验完成了两个子线程的互斥。在主程序中首先使用InitializeCriticalSection()初始化临界区,然后建立了两个子线程,在两个子线程中使用全局变量count的前后分别使用了EnterCriticalSection()进入临界区及使用LeaveCriticalSection()退出临界区,两个线程互斥的执行完成后,主线程使用DeleteCriticalSection()删除临界区并撤销线程。 主要源代码: staticintcount=5; staticHANDLEh1; staticHANDLEh2; LPCRITICAL_SECTIONhCriticalSection; CRITICAL_SECTIONCritical; voidfunc1(); voidfunc2(); DWORDdwThreadID1,dwThreadID2; hCriticalSection=&Critical; InitializeCriticalSection(hCriticalSection); h1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func1, NULL, 0, &dwThreadID1); if(h1==NULL) { printf("Thread1createFail!\n"); } else printf("Thread1createSuccess!\n"); h2=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func2, NULL, 0, &dwThreadID2); if(h2==NULL) { printf("Thread2createFail!\n"); } else printf("Thread2createSuccess!\n"); Sleep(1000); CloseHandle(h1); CloseHandle(h2); DeleteCriticalSection(hCriticalSection); ExitThread(0); voidfunc1() { intr1; EnterCriticalSection(hCriticalSection); r1=count; _sleep(500); r1=r1+1; count=r1; printf("countinfunc1=%d\n",count); LeaveCriticalSection(hCriticalSection); } voidfunc2() { intr2; EnterCriticalSection(hCriticalSection); r2=count; _sleep