peterson算法p0流程图_Dekker算法与Peterson算法

Dekker算法与Peterson算法都是用来解决进程/线程互斥问题。

Dekker互斥算法是由荷兰数学家Dekker提出的一种解决并发进程互斥与同步的软件实现方法。(百度百科)

Peterson算法是一个实现互斥锁的并发程序设计算法,可以控制两个线程访问一个共享的单用户资源而不发生访问冲突。

Gary L. Peterson于1981年提出此算法。(百度百科)

Dekker算法思路:

当p0希望进入自己的临界区时,它把自己的flag值设为true,

然后继续检查P1的flag

如果P1的flag为false,P0可以立即进入自己的临界区。

否则 P0检查turn,如果发现turn=0,那么它知道自己该坚持进入,

从而周期性的检查P1的flag,

P1在某一点将注意到应把turn值赋为0,随后把其flag置为false,允许P0进入

在P0结束其临界区后,把自己的flag置为false。释放 其临界区,并把turn值置为1

从而把坚持进入的权利转交给P1。

Dekker算法

C++

//Dekker算法

bool flag[2];//提供所有进程的状态

int turn;//表示哪个进程应坚持进入

void p0()

{

while(true)

{

flag[0]=true;//P0想使用临界区

while(flag[1])//P1也想使用

if(turn==1)//确实轮到了P1使用

{

flag[0]=false;//P0取消请求

while(turn==1)

/*什么也不做*/

flag[0]=true;//P1用完后,P0继续发出请求

}

临界区

flag[0]=false;//p0用完了

turn=1;//将权限移交给P1

其余部分

}

}

void p1()

{

while(true)

{

flag[1]=true;

while(flag[0])

if(turn==0)

{

flag[1]=false;

while(turn==0)

/*什么也不做*/

flag[1]=true;

}

临界区

flag[1]=fasle;

turn=0;

}

}

void main()

{

turn=0;

flag[0]=false;

flag[1]=false;

perbegin(p0(),p1());

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

//Dekker算法

boolflag[2];//提供所有进程的状态

intturn;//表示哪个进程应坚持进入

voidp0()

{

while(true)

{

flag[0]=true;//P0想使用临界区

while(flag[1])//P1也想使用

if(turn==1)//确实轮到了P1使用

{

flag[0]=false;//P0取消请求

while(turn==1)

/*什么也不做*/

flag[0]=true;//P1用完后,P0继续发出请求

}

临界区

flag[0]=false;//p0用完了

turn=1;//将权限移交给P1

其余部分

}

}

voidp1()

{

while(true)

{

flag[1]=true;

while(flag[0])

if(turn==0)

{

flag[1]=false;

while(turn==0)

/*什么也不做*/

flag[1]=true;

}

临界区

flag[1]=fasle;

turn=0;

}

}

voidmain()

{

turn=0;

flag[0]=false;

flag[1]=false;

perbegin(p0(),p1());

}

Peterson算法思路:

考虑进程P0,一旦它把flag[0]置为true,P1不能进入其临界区;

如果P1已经在临界区中,则flag[1]=true;且P0被阻止进入临界区。

另一方面,还可以防止相互阻塞

假设P0在它的while循环被阻塞,这意味这flag[1]=true且turn=1

则当flag[1]变为false或者turn变为0时,P0都可以进入自己的临界区

boolean flag[2]={false,true};

int turn;

void p0()

{

while(true)

{

flag[0]=true;

turn=1;

while(flag[1]&&turn==1)//1号想使用且拥有使用权

/*什么也不做*/

临界区

flag[0]=false;

/*其余部分*/

}

}

void p1()

{

while(true)

{

flag[1]=true;

turn=0;

while(flag[0]&&turn==0)

/*什么也不做*/

临界区

flag[1]=false;

/*其余部分*/

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

booleanflag[2]={false,true};

intturn;

voidp0()

{

while(true)

{

flag[0]=true;

turn=1;

while(flag[1]&&turn==1)//1号想使用且拥有使用权

/*什么也不做*/

临界区

flag[0]=false;

/*其余部分*/

}

}

voidp1()

{

while(true)

{

flag[1]=true;

turn=0;

while(flag[0]&&turn==0)

/*什么也不做*/

临界区

flag[1]=false;

/*其余部分*/

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值