DEKKER算法
Posted jianmoxiansheng-guo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于DEKKER算法的主要内容,如果未能解决你的问题,请参考以下文章
有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]