DEKKER算法

今天在学习的时候,卡在DEKKER算法这里一下,脑袋一阵迷糊,竟然扣了几个小时,经过调试求证了一些事情,就是为什么要在循环里面更改各自的状态。

这里先引用一下百度百科的资料,说的通俗易懂,看完之后就会明白个大概。

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也举手了,那么久看看到底轮到谁
flag[1]=false;// 如果确实轮到P0,那么P1先把手放下(让P0先)
while(turn==0);// 只要还是P0的时间,P1就不举手,一直等
flag[0]=true;// 等到P0用完了(轮到P1了),P1再举手
}
}
visit();// 访问临界区
turn = 0;// P1访问完了,把轮次交给P0,让P0可以访问
flag[1]=false;// P1放下手

首先是测试程序:

#include <iostream>
#include <pthread.h>
#include <string>
#include <unistd.h>
using namespace std;
string test;
bool Ptrue = false;
bool Qtrue = false;
int trun = 2;
void *funP(void* argc){
    while(1){
    Ptrue = true;
    while (Qtrue) {
        if(trun == 2){
            //Ptrue = false;
            while(trun == 2);
            //Ptrue = true;
        }
    }
    cout << "1" << endl;
    trun = 2;
    Ptrue = false;
    }
}
void *funQ(void* argc){
    while(1){
    Qtrue = true;
    while (Ptrue) {
        if(trun == 1){
           // Qtrue = false;
            while(trun == 1);
            //Qtrue = true;
        }
    }
    cout << "2" << endl;
    trun = 1;
    Qtrue = false;
    }

}
int main(){
    pthread_t p,q;
    pthread_create(&p,NULL,funP,NULL);
    pthread_create(&q,NULL,funQ,NULL);
    sleep(0.1);
}

如果要调试,注意把sleep里面的睡眠时间增大。

接着便是对于while循环里面的理解了,因为口述不容易说清楚,所以,就直接把草稿纸放上(有点潦草):

 参考链接:

  百度百科:https://baike.baidu.com/item/Dekker%E7%AE%97%E6%B3%95/8383988?fr=aladdin

posted @ 2020-06-11 23:15  缄默先生  阅读(790)  评论(0编辑  收藏  举报