Dekker算法
后台-插件-广告管理-内容页头部广告(手机) |

Dekker互斥算法是由荷兰数学家Dekker提出的一种解决并发进程互斥与同步的商古硫冷软件实现方法。
- 中文名称 Dekker算法
- 外文名称 Dekker algorithm
- 提出者 荷兰数学家Dekker
- 解决问题 并发进程互斥与同步
- 类别 并发编程的算法
参数说明
两个全局共享的状态变量苏其坚略米差深黄flag[0]和flag[1],表示临界区状态及哪个进程想要占用临界区,初始值为0。
较命明准章静教全局共享变量turn(值为1或0)表示能进入临界区的进程序号,初始值任意,一般为0。
算法原理
设有进程P0和P1,两来自者谁要访问临界区,就让慢底径刻剧客应至宣对应的flag=true(例如P0要访问临界区,就让flag[0]=true),相当于"举手示意我要访问"。初始值为0表示一开始没人要访问
turn用于标360百科识当前允许谁进入,turn=0则P0可进入,turn=1则P1可进入。
1)P0的逻辑
练 do{
flag[0德父耐植载件模求苗阻青] = true;// 首先P0举手示意我要访问
while(flag[1]) {// 看看P1是否也举手了
if(turn==1){// 如果P1也举手了,那么就看看到底轮到谁
flag[序干种班出抓升许被至于0]=false爱告;// 如果确实轮到P1,那么P0先把手放下(让P1先)
while(turn==1);// 只要还是P1的时间,P0就不举手,一直等
flag[0]=true;// 等到P1用完了(轮到P0了),P0再举手
}
还 flag[1] = false; // 只要可以跳出循环,说明P1用完了,应该跳出最外圈的while
}
式速师皇句visit();// 访问临界区
turn = 1;// P0访问完了,把轮次交给P1,让P1可以访问
flag[0]=false;// P0放下手
2)P1的逻辑
do太小境马叶抓罪子进话{
flag[1] = true;// 先P1举手察责示意我要访问
while(flag[0]) {// 如果P0是否也举手了
if(turn==0){// 如果P0也举手了,那么久看看到底轮到谁
f娘者校lag[1]=false;// 如果确实轮到P0,那么P1先把手放下(让P0先)
while(turn==0);// 只要还是P0的时间,P1就不举钱市衣乙台父根容手,一直等
flag[1]=true;// 等到P0用完了(轮到P1了),P1再举手
}
flag[0] = fals推课向坏e; // 只要可以跳出循环,说明P0用完了,应该跳出最外圈的while
}
visit();// 访问临界区
turn = 0;// P1访问完了,把轮次交煤官当解素革再乱盟今给P0,让P0可以访问
帝操flag[1]=false;// P1放下手
代码实现
实现方法:
boolean flag[2];
int turn;
void procedure0()
{
while(tr来自ue)
{
flag[0]=true;
while(flag[1]==true)
{
if哪万伟值族犯害为(turn==1)
{
flag[0]=false;
while(turn==1)
{
/*do noth叫象水病总频欢夫代增乎ing*/
}
flag[0]=true;
}
}
/*critical section*/ ;
turn=1;
flag[0]=false;
/*remainder section*/
}
360百科}
void proc周白edure()
{
whi治le(true)
{
flag[1]=true;
while(flag夜微冷末殖[0]==true)
{
if(turn==0)
{
flag[1]=false;
while(turn==0)
{
/*do nothing*/
}
flag[1]=true;
}
}
/*criti念谁望弱cal section*/ ;
turn=0;
flag[1]=false;
/*remainder section*/
}
}
void main()
{
投迫云图吗从下过基 flag[0]=flag[1]=0;
turn=1;
/*start p交友rocedure0 and p川rocedure1*/ ;
}
后台-插件-广告管理-内容页尾部广告(手机) |
标签:
相关文章
发表评论
评论列表