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

在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:临界区外运行的进程不能阻塞其他进程,所以严格轮换法不是一种很好的解决方案。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357