美文网首页
IPC中避免竞争条件-严格轮换法

IPC中避免竞争条件-严格轮换法

作者: _NewMoon | 来源:发表于2020-07-29 11:17 被阅读0次

在IPC问题中,避免竞争条件实现互斥有多种方案:

  • 1.屏蔽中断
  • 2.锁变量
  • 3.严格轮换法
  • 4.Peterson解法
  • 5.TSL指令

避免竞争条件 :
1 -任何两个进程不能同时处于其临界区
2 -不应对CPU的速度与数量进行比较
3 -临界区外运行的进程不得阻塞其他进程
4 -不得使进程无限期等待进入临界区

本文中着重介绍严格轮换法:
所谓的严格轮换法就是引入一个变量turn指示当前轮到哪个进程进入临界区,比如目前有两个进程0和1,一开始,我们让turn为0,进程0检查turn是否为0,当前turn为0,所以进程0进入临界区,而进程1发现turn为0,所以在外等待,一直等待turn的值变为1,像这样连续测试一个变量直到某个值出现为止的过程称为忙等待,在进程0退出临界区后,将turn置为1,这时进程1进入临界区,进程0完成剩余的工作,如此循环。

下面利用代码来直观理解一下流程:
代码借鉴于:https://blog.csdn.net/qq_41636947/article/details/101105143

#include <windows.h>
#include <cstdio>
#include <iostream>
#include <process.h>

using namespace  std;

int turn;  //全局变量
CRITICAL_SECTION cs;  //临界区

// DWORD == double word 一般用来保存地址或者存放指针
// WINAPI  == _stdcall
// LPVOID == void* 没有类型的指针
DWORD WINAPI fun_1(LPVOID p){
    while(TRUE){
        while(turn!=0);
        EnterCriticalSection(&cs);  //进入临界区
        cout<<"process 0: ";
        turn = 1;               
        cout<<turn<<'\n';
        LeaveCriticalSection(&cs); //离开临界区
    }
}

DWORD WINAPI fun_2(LPVOID p){
    while(TRUE){
        while(turn!=1);
        EnterCriticalSection(&cs);  
        cout<<"process 1: ";
        turn = 0;
        cout<<turn<<'\n';
        LeaveCriticalSection(&cs);
    }
}
int main()
{
    InitializeCriticalSection(&cs);
    HANDLE th1,th2;  //创建两个进程
    th1 = CreateThread(nullptr,0,fun_1, nullptr,0, nullptr);
    th2 = CreateThread(nullptr,0,fun_2, nullptr,0, nullptr);
    Sleep(1000);    //让进程0和进程1有足够的反应时间
    CloseHandle(th1);
    CloseHandle(th2);
    return 0;
}

代码运行结果:


result

存在的问题

从结果来看,进程0和进程1的确在进入临界区时互斥,但这个方法还是存在一个竞争条件。
思考一下,当进程1退出临界区并将turn设置为0时,进程1进入非临界区工作,这时进程0检查到turn为0,所以进程0进入临界区,而且进程0很快离开临界区(这次非常快完成工作),然后将turn置为1,同样很快离开非临界区进入下一轮循环,但此时,进程1还在非临界区工作,而进程0就会被阻塞,而这种情况不满足避免竞争条件中的3:临界区外运行的进程不能阻塞其他进程,所以严格轮换法不是一种很好的解决方案。

相关文章

  • IPC中避免竞争条件-严格轮换法

    在IPC问题中,避免竞争条件实现互斥有多种方案: 1.屏蔽中断 2.锁变量 3.严格轮换法 4.Peterson解...

  • 3.1共享数据带来的问题

    3.1.1条件竞争 恶性条件竞争通常发生在,完成对多于一个数据块的修改时。 3.1.2避免恶性条件竞争 解决方法:...

  • 共享数据和线程

    共享数据带来的问题 条件竞争 条件竞争产生 并发中竞争条件的形成,取决于一个以上线程的相对执行顺序,每个线程都抢着...

  • 2019-02-07

    惩罚是为了消除学生不良行为再发生的可能。在教育中,要从爱护学生的角度出发,在尊重、信任学生的条件下进行,应严格避免...

  • 【捷报】网智天元连续中标2家商业银行数据脱敏项目

    6月,网智天元在金融领域的捷报接连不断。在经过前期多轮严格筛选、测试、评审后,网智天元在众多竞争厂商中脱颖而出,以...

  • 避免竞争

    每一次打卡知识星球的时候,就想吐槽这个软件。bug特别多。 最烦人的是,第一次打卡我的标签加错了,加的不是#个体崛...

  • 不怕竞争,才能一直向前

    01 人生在世,竞争不可避免。每个人,都是在竞争中成长,在竞争中丰满了自己。 人只要活着,就不要惧怕竞争,竞争是社...

  • IPC机制(上)

    目录 Android IPC简介 Android中的多进程模式 IPC基础概念介绍 Android IPC简介 I...

  • Android中的IPC方式——Binder(三)

    Android中的IPC方式——Binder(一) Android中的IPC方式——Binder(二) 基于A...

  • Android Binder及其周边知识梳理

    IPC-概述与Android中的进程 IPC - Binder还要从Service说起 IPC -通过AIDL看B...

网友评论

      本文标题:IPC中避免竞争条件-严格轮换法

      本文链接:https://www.haomeiwen.com/subject/oichrktx.html