1、2011年1月5日2. 实践内容简要描述 实践目标 1.理解临界区问题2.学会使用Win32所提供的同步对象(事件对象、互斥对象、信号量对象、临界区对象等)以解决临界区问题 实践内容 协作线程兄弟问题设置竞争条件:定义两个全局变量:accnt1和accnt2,初值都为零;创建两个线程acc1和acc2;(1)获得一个随机数(2)从accnt1减去这个随机数;(3)将这个随机数加到accnt2中;(4)正确的话,accnt1+accnt2=0;(5)但在未实现线程互斥的情况下,accnt1+accnt2可能不为0。用临界区对象实现协作线程,以解决以上临界区问题兄弟问题。 设计思路 利用临界区对象
2、(CRITICAL_SECTION型),实现线程间的互斥。 主要数据结构 typedef struct BrotherInfo int miSerial;DWORD mdwDelay; BROTHERINFO,*PBROTHERINFO;volatile int giAccnt1 = 0; /* Ensure variable in the memory */volatile int giAccnt2 = 0;CRITICAL_SECTION my_section; 主要代码结构及分析/threadDWORD WINAPI Brother(LPVOID lpParam) int iLoan,
3、iAccnt,iCounter = 0;PBROTHERINFO pThreadInfo;/get info from parampThreadInfo = (PBROTHERINFO)lpParam;srand( (unsigned)pThreadInfo - mdwDelay );do fprintf(stdout,I am thread %d , I am doing %05dth stepn,pThreadInfo - miSerial,iCounter);iLoan = rand();/* fprintf(stdout,rand_num = %05d n,iLoan); */Slee
4、p(pThreadInfo- mdwDelay*INTE_PER_SEC);EnterCriticalSection(&my_section); /等待进入临界区的授权/start of critical_sectiongiAccnt1 = giAccnt1 - iLoan;Sleep(pThreadInfo-giAccnt2 = giAccnt2 + iLoan;iAccnt = giAccnt1 + giAccnt2;/end of critical_sectionLeaveCriticalSection(&/释放对临界区的使用权iCounter+; while ( (iAccnt = 0
5、) & (iCounterSettingsC/C+标签页Category:Code GenertionUse run-time library:”,此处一开始我选的是“Multithreaded”,而选择“Debug Multithreaded”则可避免上述问题 实践体会和收获 通过此次实验,我了解了临界区变量的使用方法及作用,并且相较而言,使用临界区变量比用软件方法解决兄弟问题要简单。在第二个任务的基础上,此次任务并没有花费太多的时间就得以完成。5. 参考文献 1汤子灜著.计算机操作系统 (修订版) M. 西安:西安电子科技大学出版社. 2000 2Abraham Silberschatz ,Peter Baer Galvin and Greg Gagne. 郑扣根等译.操作系统概念 第六版,翻译版. M.北京:高等教育出版社. 2004
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1