发现文章标题:任务3- 同步对象解决临界问题
任务3- 同步对象解决临界问题
第一篇:任务3-同步对象解决临界问题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型),实现线程间的互斥。主要数据结构
typedefstructbrotherinfo{int
miserial;dwordmdwdelay;}brotherinfo,*pbrotherinfo;
volatileintgiaccnt1=0;/*ensurevariableinthememory*/volatileintgiaccnt2=0;critical_sectionmy_section;主要代码结构及分析
//threaddwordwinapibrother(lpvoidlpparam){intiloan,iaccnt,icounter=0;pbrotherinfopthreadinfo;
//getinfofromparampthreadinfo=(pbrotherinfo)lpparam;
srand((unsigned)pthreadinfo->mdwdelay);
do{fprintf(stdout,"iamthread%d,iamdoing%05dthstep\n",pthreadinfo->miserial,icounter);iloan=rand;/*fprintf(stdout,"rand_num=%05d\n",iloan);*///sleep(pthreadinfo->mdwdelay*inte_per_sec);
entercriticalsection(&my_section);//等待进入临界区的授权
//startofcritical_sectiongiaccnt1=giaccnt1-iloan;sleep(pthreadinfo->mdwdelay*inte_per_sec);giaccnt2=giaccnt2+iloan;iaccnt=giaccnt1+giaccnt2;//endofcritical_section
leavecriticalsection(&my_section);//释放对临界区的使用权
icounter++;}while((iaccnt==0)&&(icountersettings—>c/c++标签页—>category:codegenertion—>userun-timelibrary:”,此处一开始我选的是“multithreaded”,而选择“debugmultithreaded”则可避免上述问题实践体会和收获
通过此次实验,我了解了临界区变量的使用方法及作用,并且相较而言,使用临界区变量比用软件方法解决兄弟问题要简单。在第二个任务的基础上,此次任务并没有花费太多的时间就得以完成。
(未完,全文共9337字,当前显示1497字)
(请认真阅读下面的提示信息)