您好,欢迎来到刀刀网。
搜索
您的当前位置:首页Peterson算法解决临界问题

Peterson算法解决临界问题

来源:刀刀网
Peterson算法解决临界问题

1.基本信息

实践题⽬:Peterson算法解决临界问题完成⼈:班级:08065801姓名:崔洋

加宾学号:0806580111报告⽇期:2011年11⽉1⽇2.实践内容简要描述实践⽬标1.理解临界区问题

2.掌握Peterson算法以解决临界区问题实践内容

协作线程——兄弟问题设置竞争条件:

定义两个全局变量:accnt1和accnt2,初值都为零;创建两个线程acc1和acc2;(1)获得⼀个随机数

(2)从accnt1减去这个随机数;(3)将这个随机数加到accnt2中;(4)正确的话,accnt1+accnt2=0;

(5)但在未实现线程互斥的情况下,accnt1+accnt2可能不为0。⽤软件⽅法实现协作线程,以解决以上临界区问题——兄弟问题。可采⽤Peterson算法或Dekker算法。设计思路

利⽤Peterson算法,实现线程间的互斥。boolean flag[2];//初值falseint turn;do{flag[i]:=true;turn=j;

while(flag[j] and turn=j);临界区;flag[i]=false;剩余区;

}while(1);

i为线程⾃⾝的序号减去1,j为2减去该线程的序号。

当某⼀进程试图访问临界区时,若另⼀进程已在访问临界区,则该线程通过循环等待直⾄另⼀线程退出临界区⽅可执⾏。主要数据结构

typedef struct BrotherInfo {int miSerial;DWORD mdwDelay;

} BROTHERINFO,*PBROTHERINFO;

volatile int giAccnt1 = 0; /* Ensure variable in the memory */volatile int giAccnt2 = 0;

bool flag[2]={false,false};//Peterson算法,初始赋falseint turn;

主要代码结构及分析//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\iLoan = rand();

/* fprintf(stdout,\"rand_num = %05d \\n\//Sleep(pThreadInfo-> mdwDelay*INTE_PER_SEC);flag[pThreadInfo->miSerial-1]=true;turn=2-pThreadInfo->miSerial;

while(flag[2-pThreadInfo->miSerial]&&turn==2-pThreadInfo->miSerial);//临界区//start of critical_section//start of critical_sectiongiAccnt1 = giAccnt1 - iLoan;

Sleep(pThreadInfo-> mdwDelay*INTE_PER_SEC);giAccnt2 = giAccnt2 + iLoan;iAccnt = giAccnt1 + giAccnt2;//end of critical_section

flag[pThreadInfo->miSerial-1]=false;//剩余区iCounter++;

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

fprintf(stdout,\"Now giAccnt1+giAccnt2 = %05d\\n\return 0 ;} //End of Brother3.实践结果基本数据:

源程序代码⾏数:163

完成实践投⼊的时间(⼩时数):0.5资料查阅时间:0.5编程调试时间:0.2测试数据设计

“ex2.dat”中测试数据为:1 12 3

测试结果分析

由于两线程互斥访问临界区,giAccnt1+giAccnt2的和始终为0。等执⾏次数超过⼗次时才退出循环。4.实践体会

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

1通过学习pdf明⽩了临界问题产⽣的原因,并找出了题⽬的解决⽅案。

2、使⽤Peterson算法时,由于两线程共⽤⼀个函数,则Peterson算法中的flag[i],flag[j]

对应的i、j则要有通⽤的表⽰⽅法。通过⽐较发现i可对应pThreadInfo->miSerial-1,j 可对应2-pThreadInfo->miSerial。实践体会和收获

通过此次实验,我基本了解了线程的创建及运⾏过程。通过学习明⽩临界问题产⽣与Peterson算法的实现。5.参考⽂献

[1]汤⼦灜著.《计算机操作系统》(修订版)[M]. 西安:西安电⼦科技⼤学出版社. 2000

[2] Abraham Silberschatz ,Peter Baer Galvin and Greg Gagne. 郑扣根等译.操作系统概念第六版,翻译版. [M].北京:⾼等教育出版社. 2004

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务