《操作系统原理 第2版实验与思考第4章线程.docx》由会员分享,可在线阅读,更多相关《操作系统原理 第2版实验与思考第4章线程.docx(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【实验与思考】利用互斥体保护共享资源在本实验中,通过对互斥体对象的了解,来加深对Windows线程同步的理解。(1) 了解在进程中如何使用互斥体对象。(2) 了解父进程创建子进程的程序设计方法。1 .工具/准备工作在开始本实验之前,请回顾教科书的相关内容。需要准备一台运行Windows操作系统的计算机,且该计算机中需安装Visual C+ 6.0。2 .实验内容与步骤清单4-1的程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数 值的访问。每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。创建者实 际上创建的是互斥体对象,计数方法执行等待并释放,为的是
2、共同使用互斥体所需的资源(因 而也就是共享资源)。步骤1:编辑实验源程序4-l.cpp (也可直接打开下载的源程序文件4-l.cpp)0清单47利用互斥体保护共享资源。/ mutex 项目# include # include /利用互斥体来保护同时访问的共享资源class CCountUpDown(public:/创建者创建两个线程来访问共享值CCountUpDown(int nAccesses):m_hThread!nc(INVALID_HANDLE_VALUE),m_hThreadDec(INVALID_HANDLE_VALUE), m_hMutexValue(INVALID_HANDL
3、E_VALUE), m_nValue(0),m_nAccess(nAccesses)(/创建互斥体用于访问数值m_hMutexValue=:CreateMutex(NULL,/缺省的安全性TRUE,/初始时拥有,在所有的初始化结束时将释放NULL) ;/匿名的m_hThreadInc=:CreateThread(NULL,/缺省的安全性0,/缺省堆栈IncThreadProc,/类线程进程reinterpret_cast (this) r/ 线程参数0,/无特殊的标志NULL) ;/忽略返回的idm_hThreadDec = : CreateThread(NULL,/缺省的安全性0,/缺省堆栈
4、DecThreadProc,/类线程进程reinterpret_cast (this) ,/线程参数0,/无特殊的标志NULL) ;/忽略返回的id/允许另一线程获得互斥体:ReleaseMutex(m_hMutexValue); )/解除程序释放对对象的引用 virtual CCountUpDown() (:CloseHandle(m_hThread!nc);:CloseHandle(m_hThreadDec);:CloseHandle(m_hMutexValue);/简单的等待方法,在两个线程终止之前可暂停主调者 virtual void WaitForCompletion() (/确保所
5、有对象都已准备好if (m_hThreadInc!=INVALID_HANDLE_VALUE & m_hThreadDec!=INVALID_HANDLE_VALUE)/等待两者完成(顺序并不重要):WaitForSingleObj ect(m_hThreadInc,INFINITE);:WaitForSingleObj ect(m_hThreadDeczINFINITE); )protected:/改变共享资源的简单的方法 virtual void DoCount(int nStep) (/循环,直到所有的访问都结束为止 while (1) (/等待访问数值:WaitForSingleObj
6、 ect(m_hMutexValue,INFINITE);if (m_nAccess0) /改变并显示该值 m_nValue+=nStep;std: : coutthread: GetCurrentThreadld ()xvalue : z,m_nvalueaccess : ,m_nAccess std:endl;/发出访问信号并允许线程切换-m_nAccess;:Sleep(1000) ;/实现线程切换,并使显示速度放慢/释放对数值的访问:ReleaseMutex(m_hMutexValue); ) else break;)static DWORD WINAPI IncThreadProc(
7、LPVOID IpParam)/将参数解释为this,指针CCountUpDown* pThis=reinterpret_cast(IpParam);/调用对象的增加方法并返回一个值pThis-DoCount (4-1);return (0);static DWORD WINAPI DecThreadProc(LPVOID IpParam) (/将参数解释为this,指针CCountUpDown* pThis=reinterpret_cast(IpParam);/调用对象的减少方法并返回一个值pThis-DOCount (-1);return (0);protected:HANDLE m_hT
8、hreadInc;HANDLE m_hThreadDec;HANDLE m_hMutexValue;int m_nValue;int m_nAccess;;void main() (CCountUpDown ud(50);ud , WaitForCompletion() ; )步骤2:单击Build菜单中的Compile 4-l.cpp命令,并单击“是”按钮确认,系统对4-l.cpp 进行编译。步骤3:编译完成后,单击Build菜单中的Build 4-l.exe命令,建立4-l.exe可执行文件。请记录:操作能否正常进行?如果不行,则可能的原因是什么?步骤4:在工具栏单击Execute Pro
9、gram按钮,执行4-l.exe程序。分析程序4-1的运行结果,可以看到线程(加和减线程)的交替执行(因为Sleep。API允 许Windows切换线程)。在每次运行之后,数值应该返回初始值(0),因为在每次运行至sleep。 语句后,写入线程在等待队列中变成最后一个,内核保证它在其他线程工作时不会再运行,力口、 减线程各自运行了 25次。(1)请描述运行结果(如果运行不成功,则可能的原因是什么?):(2)根据运行输出结果,对照分析4-1程序,可以看出程序运行的流程吗?请简单描述加、 减线程是如何交替执行的?(3)程序4-1中临界资源、临界区各是什么?是如何实现线程对临界资源的互斥访问的?3.实验总结4.教师实验评价