1.基本信息
实践题目:同步对象解决临界问题 完成人:
班级:07062301 姓名:陈杨
学号:0706230101
报告日期 :2011年1月5日 2.实践内容简要描述
实践目标
1.理解临界区问题
2.学会使用Win32所提供的同步对象(事件对象、互斥对象、信号量对象、临界区对象等)以解决临界区问题 实践内容
协作线程——兄弟问题 设置竞争条件:
定义两个全局变量:accnt1和accnt2,初值都为零; 创建两个线程acc1和acc2; (1)获得一个随机数
(2)从accnt1减去这个随机数; (3)将这个随机数加到accnt2中; (4)正确的话,accnt1+accnt2=0;
(5)但在未实现线程互斥的情况下,accnt1+accnt2可能不为0。 用临界区对象实现协作线程,以解决以上临界区问题——兄弟问题。 设计思路
利用临界区对象(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; 主要代码结构及分析
//thread DWORD WINAPI Brother(LPVOID lpParam) { int iLoan, iAccnt,iCounter = 0; PBROTHERINFO pThreadInfo;
//get info from param pThreadInfo = (PBROTHERINFO)lpParam;
srand( (unsigned)pThreadInfo -> mdwDelay );
do { fprintf(stdout,\"I am thread %d , I am doing %05dth step\\n\",pThreadInfo -> miSerial,iCounter); iLoan = rand(); /* fprintf(stdout,\"rand_num = %05d \\n\",iLoan); */ //Sleep(pThreadInfo-> mdwDelay*INTE_PER_SEC);
EnterCriticalSection(&my_section); //等待进入临界区的授权
//start of critical_section giAccnt1 = giAccnt1 - iLoan; Sleep(pThreadInfo-> mdwDelay*INTE_PER_SEC); giAccnt2 = giAccnt2 + iLoan; iAccnt = giAccnt1 + giAccnt2; //end of critical_section
LeaveCriticalSection(&my_section);//释放对临界区的使用权
iCounter++; } while ( (iAccnt == 0) && (iCounter
fprintf(stdout,\"Now giAccnt1+giAccnt2 = %05d\\n\",iAccnt); return 0 ; } //End of Brother 3.实践结果
基本数据 :
源程序代码行数 :166 完成实践投入的时间(小时数):0.5 资料查阅时间:0.2 编程调试时间:0.3 测试数据设计
“ex3.dat”中测试数据为: 1 1 2 3 测试结果分析
利用临界区变量使两线程互斥访问临界区,giAccnt1+giAccnt2的和始终为0。等执行次数超过十次时才退出循环。执行结果正确。
4.实践体会
实践过程中遇到的问题及解决过程
在链接过程中出现错误如下:
后发现是“Project—>Settings—>C/C++标签页—>Category:Code Genertion—>Use run-time library:”,此处一开始我选的是“Multithreaded”,而选择“Debug Multithreaded”则可避免上述问题 实践体会和收获
通过此次实验,我了解了临界区变量的使用方法及作用,并且相较而言,使用临界区变量比用软件方法解决兄弟问题要简单。在第二个任务的基础上,此次任务并没有花费太多的时间就得以完成。 5.参考文献
[1]汤子灜著.《计算机操作系统》 (修订版) [M].西安:西安电子科技大学出版社.2000 [2] Abraham Silberschatz ,Peter Baer Galvin and Greg Gagne.郑扣根等译.操作系统概念 第六版,翻译版.[M].北京:高等教育出版社.2004