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