【vc++精品源码栏目提醒】:网学会员为广大网友收集整理了,操作系统原理实验_线程的互斥3 - 其它资料,希望对大家有所帮助!
上海电力学院计算机操作系统原理 实验报告题目: 线程的同步院系: 计算机科学与技术学院专业年级: 信息安全 2010 级学生20103277同组年 11 月 13 日 上 海 电 力 学 院 实 验 报 告课程名称 计算机操作系统原理 实验项目 线程的同步姓名 李鑫 学号 20103277 班级 2010251 班 专业 信息安全同组人姓名 无 指导教师姓名 徐曼 实验日期 2012/11/13实验目的和要求:1、进一步掌握 Windows 系统环境下线程创建与撤销。
2、熟悉 Windows 系统提供的线程互斥 API。
3、使用 Windows 系统提供的线程互斥 API 解决实际问题。
实验原理与内容 完成两个子线程之间的互斥。
在主线程中使用系统调用 CreateThread创建两个子线程,并使两个子线程互斥地使用全局变量 count。
实验平台与要求 能 正 确 使 用 临 界 区 对 象 , 包 括 初 始 化 临 界 区InitializeCriticalSection、进入临界区 EnterCriticalSection、退出临界区 LeaveCriticalSection及删除临界区 DeleteCriticalSection,进一步理解线程的互斥。
操作系统:Windows 2000 或 Windows XP实验平台:Visual Studio C 6.0实验步骤与记录1、 启动安装好的 Visual C 6.0。
2、 选择 File-New,新建 Win32 Console Application 控制台程序。
3、 由于 CreateThread()等函数是 Microsoft Windows 操作系统的系统调用,因此选择 An application that supports MFC,之后单击 Finish 按钮。
4、 打开编辑环境后,编辑程序,并且编译、链接并运行该程序。
5、6、实验分析与结论 本实验完成了两个子线程的互斥。
在主程序中首先使用 InitializeCriticalSection初始化临界区,然后建立了两个子线程,在两个子线程中使用全局变量 count 的前后分别使用了EnterCriticalSection进入临界区及使用 LeaveCriticalSection退出临界区,两个线程互斥的执行完成后,主线程使用 DeleteCriticalSection删除临界区并撤销线程。
主要源代码:static int count5static HANDLE h1static HANDLE h2LPCRITICAL_SECTION hCriticalSectionCRITICAL_SECTION Criticalvoid func1void func2 DWORD dwThreadID1dwThreadID2 hCriticalSectionCritical InitializeCriticalSectionhCriticalSection h1CreateThreadNULL 0 LPTHREAD_START_ROUTINEfunc1 NULL 0 dwThreadID1 if h1NULL printfThread1 create Failn else printfThread1 create Successn h2CreateThreadNULL 0 LPTHREAD_START_ROUTINEfunc2 NULL 0 dwThreadID2 if h2NULL printfThread2 create Failn else printfThread2 create Successn Sleep1000 CloseHandleh1 CloseHandleh2 DeleteCriticalSectionhCriticalSection ExitThread0void func1 int r1 EnterCriticalSectionhCriticalSection r1count _sleep500 r1r11 countr1 printfcount in func1dncount LeaveCriticalSectionhCriticalSectionvoid func2 int r2 EnterCriticalSectionhCriticalSection r2count _sleep500 r2r21 countr2 printfcount in func2dncount LeaveCriticalSectionhCriticalSection实验展望工程已经放入电子版中使用 Mutex 来完成,并且使得 count33 时退出,源代码:static int count5static HANDLE h1static HANDLE h2HANDLE hMutexvoid func1void func2int _tmainint argc TCHAR argv TCHAR envp int nRetCode 0 DWORD dwThreadID1dwThreadID2 hMutexCreateMutexNULLFALSEMutexName1//lable: h1CreateThreadNULL 0 LPTHREAD_START_ROUTINEfunc1 NULL 0 dwThreadID1 if h1NULL printfThread1 create Failn else printfThread1 create Successn h2CreateThreadNULL 0 LPTHREAD_START_ROUTINEfunc2 NULL 0 dwThreadID2 if h2NULL printfThread2 create Failn else printfThread2 create Successn Sleep1000// goto lable CloseHandleh1 CloseHandleh2 ReleaseMutexhMutex ExitThread0 return nRetCodevoid func1 int r1 HANDLE hOpenMutex whilecount