任务3--同步对象解决临界问题.doc

上传人:聆听****声音 文档编号:768929 上传时间:2023-04-30 格式:DOC 页数:3 大小:72KB
下载 相关 举报
任务3--同步对象解决临界问题.doc_第1页
第1页 / 共3页
任务3--同步对象解决临界问题.doc_第2页
第2页 / 共3页
任务3--同步对象解决临界问题.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

任务3--同步对象解决临界问题.doc

《任务3--同步对象解决临界问题.doc》由会员分享,可在线阅读,更多相关《任务3--同步对象解决临界问题.doc(3页珍藏版)》请在冰点文库上搜索。

任务3--同步对象解决临界问题.doc

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;

Ø主要代码结构及分析

//thread

DWORDWINAPIBrother(LPVOIDlpParam){

intiLoan,iAccnt,iCounter=0;

PBROTHERINFOpThreadInfo;

//getinfofromparam

pThreadInfo=(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_section

giAccnt1=giAccnt1-iLoan;

Sleep(pThreadInfo->mdwDelay*INTE_PER_SEC);

giAccnt2=giAccnt2+iLoan;

iAccnt=giAccnt1+giAccnt2;

//endofcritical_section

LeaveCriticalSection(&my_section);//释放对临界区的使用权

iCounter++;

}while((iAccnt==0)&&(iCounter<10));

fprintf(stdout,"NowgiAccnt1+giAccnt2=%05d\n",iAccnt);

return0;

}//EndofBrother

3.实践结果

Ø基本数据:

²源程序代码行数:

166

²完成实践投入的时间(小时数):

0.5

ü资料查阅时间:

0.2

ü编程调试时间:

0.3

Ø测试数据设计

“ex3.dat”中测试数据为:

11

23

Ø测试结果分析

利用临界区变量使两线程互斥访问临界区,giAccnt1+giAccnt2的和始终为0。

等执行次数超过十次时才退出循环。

执行结果正确。

4.实践体会

Ø实践过程中遇到的问题及解决过程

在链接过程中出现错误如下:

后发现是“Project—>Settings—>C/C++标签页—>Category:

CodeGenertion—>Userun-timelibrary:

”,此处一开始我选的是“Multithreaded”,而选择“DebugMultithreaded”则可避免上述问题

Ø实践体会和收获

通过此次实验,我了解了临界区变量的使用方法及作用,并且相较而言,使用临界区变量比用软件方法解决兄弟问题要简单。

在第二个任务的基础上,此次任务并没有花费太多的时间就得以完成。

5.参考文献

²[1]汤子灜著.《计算机操作系统》(修订版)[M].西安:

西安电子科技大学出版社.2000

²[2] AbrahamSilberschatz,PeterBaerGalvinandGregGagne.郑扣根等译.操作系统概念第六版,翻译版.[M].北京:

高等教育出版社.2004

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2