zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ST的电机开发硬件套件NUCLEO-G431RB和X-NUCLEO-IHM16M1
    计算机软件世界的思维方式
    vue 动态路由配置,路由由后台返回
    element Cascader组件通过最后一级ID查找匹配的父级ID
    git push本地代码成功,远程提交未更新
    面试整理之原理问题
    JS执行环境与作用域理解
    webpack原理类型问题
    __webpack_require__(...) is not a function
    express+cors模拟解决跨域
  • 原文地址:https://www.cnblogs.com/jianmoxiansheng-Guo/p/13096746.html
Copyright © 2011-2022 走看看