任务3--同步对象解决临界问题Word格式文档下载.doc

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

任务3--同步对象解决临界问题Word格式文档下载.doc

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

任务3--同步对象解决临界问题Word格式文档下载.doc

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->

giAccnt2=giAccnt2+iLoan;

iAccnt=giAccnt1+giAccnt2;

//endofcritical_section

LeaveCriticalSection(&

//释放对临界区的使用权

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

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

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1