双线程线程互斥--Peterson算法

(本文是笔者在看jyy操作系统P4后做的笔记)

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

Peterson算法的本质是一种谦让模式,当两个线程的其中一个想进入临界区时,先观察一下另一个是否也想进入临界区,如果是,则让另一线程先进。

实现方式:

  1. 每个线程都拥有一个旗帜,表示他们是否想进入临界区(在即将进入临界区前,则会举起旗帜,在临界区结束后应放下旗帜)
  2. 临界区上有一个代表允许进入的线程的标识,当两个线程都想进入临界区时,标识上的线程率先进入
  3. 每个线程在举起自己的旗帜的同时把标识修改为另一线程,然后观察对方是否举起旗帜,只有在对方没有举起旗帜或对方举起旗帜但此时标识上指示的是自己时,该线程才可进入临界区(这句话隐含了先举起旗帜的线程一定会先进入临界区,大家可自行推理)

代码:

#define T1 1
#define T2 2

int turn;//标识
bool flag1 = false, flag2 = false;//旗帜

void thread1(){
    //临界区前代码块
    ......

    
    flag1 = true;//举起旗帜,申请进入临界区
    while(flag2 && turn == T2);//空循环,进入临界区前的判断,只有满足条件才可进入临界区
    //此处写成while(1)if(!flag2 || turn == T1)break;好像要好懂一点

    
    //临界区代码块 
    ......


    flag1 = false;//降下旗帜,释放临界区以便另一线程进入


    //临界区后代码块(即剩余区)
    ......
}

void thread2(){
    //临界区前代码块
    ......


    flag2 = true;
    while(flag1 && turn == T1);


    //临界区代码块
    ......


    flag2 = false;


    //临界区后代码块
    ......
}

Peterson算法可以保证:

  1. 不会让两个线程同时进入临界区
  2. 不会让进程进入死循环(即都不能进入临界区)
  3. 每个线程都可以进入临界区(不会让线程饿死在临界区外)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力攻坚操作系统

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值