操作系统实验六——死锁问题实验

    在两个城市南北方向之间存在一条铁路,多列火车可以分别从两个城市的车站排队等待进入车道向对方城市行驶,该铁路在同一时间,只能允许在同一方向上行车,如果同时有相向的火车行驶将会撞车。请模拟实现两个方向行车,而不会出现撞车或长时间等待的情况。您能构造一个管程来解决这个问题吗?

dp.h

#include <iostream>

#include <time.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/sem.h>

#include <sys/msg.h>

#include <sys/wait.h>



using namespace std;


typedef union semuns {

    int val;

} Sem_uns;


//定义信号量

class Sema{

public:

    Sema(int id);

    ~Sema();

    int down(); //信号量加 1

    int up(); //信号量减 1

private:

    int sem_id; //信号量标识符

};

//定义锁

class Lock{

public:

    Lock(Sema *lock);

    ~Lock();

    void close_lock();

    void open_lock();

private:

    Sema *sema; //锁使用的信号量

};

//定义条件变量

class Condition {

public:

    Condition(Sema *sema1 , Sema *sema2);

    ~Condition();

    void Wait(Lock *conditionLock,int direc); //过路条件不足时阻塞

    void Signal( int direc);        //唤醒相反方向阻塞车辆

private:

    Sema* sema[2];   // 一个方向阻塞队列

    Lock* lock;     // 进入管程时获取的锁

};



//哲学家管程的定义

class dp{

public:

    dp(int rate, int max);

    ~dp();

    void Arrive(int direc);     // 车辆准备上单行道,direc 为行车方向

    void Cross(int direc);      // 车辆正在单行道上

    void Leave(int direc);      // 车辆通过了单行道

    int getNum();

    void addNum();

    void decNum();

    //建立或获取 ipc 信号量的一组函数的原型说明

    int get_ipc_id(char *proc_file,key_t key);

    int set_sem(key_t sem_key,int sem_val,int sem_flag);

    //创建共享内存,放哲学家状态

    char *set_shm(key_t shm_key,int shm_num,int shm_flag);

private:

    int rate;   //车速

    int maxCars;   //最大同向车数

    int numCars;   //当前正在通过的车辆数

    int currentDirec;  //当前通过的车辆的方向

    Condition *con;  //通过单行道的条件变量

    Lock *lock;     //单行道管程锁


    int* curDire;//当前的方向

    int* isFirst;//是否为第一辆车

    int* irnum;//反向的等待的车辆的数量

    int* curnum;//当前方向等待的车辆的数量

    int* currentCarNum;  //当前正在通过的车辆的数量

    Sema *mutex;//互斥信号量

};

dp.cc

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值