⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 banker.cpp

📁 利用银行家算法避免死锁。掌握银行家算法中的数据结构
💻 CPP
字号:
#include <fstream.h>
#include <iostream.h>
#include "Banker.h"

extern ofstream ofsLog1;
extern ofstream ofsLog2;

Banker::Banker(int i1, int i2, int i3)
{
  ofsLog2 << "constructing banker" << endl;
  RMax.iFiles = i1;
  RMax.iPages = i2;
  RMax.iMutex = i3;
  RInUse.iFiles = 0;
  RInUse.iPages = 0;
  RInUse.iMutex = 0;

  ofsLog2 << "Banker:  RMax fpm " << i1 << i2 << i3 << endl;
}

void Banker:: helloWorld()
{
  cout << "Banker:: Hello World!" << endl;
}

void Banker :: showLimits()
{
  cout << "Banker:: showLimits currently ";
  cout << "(" << RInUse.iFiles << ", " << RInUse.iPages << ", " << RInUse.iMutex << ")";
  cout << " max ";
  cout << "(" << RMax.iFiles   << ", " <<   RMax.iPages << ", " <<   RMax.iMutex << ")";
  cout << endl;
}

void Banker::closeAccount(int iPid)
{
    ofsLog1 << "Banker::close " << iPid << "...";
    ofsLog2 << "Banker::close " << iPid << "...";

    if(RMapMax.find(iPid)== RMapMax.end())
    {
        ofsLog1 << "...NO SUCH PID." << endl;
        ofsLog2 << "...NO SUCH PID." << endl;
        throw BankerUnsafePidException();
    }
    ofsLog1 << "...found it." << endl;
    ofsLog2 << "...found it." << endl;

    RInUse.iFiles -= RMapInUse[iPid].iFiles;
    RInUse.iPages -= RMapInUse[iPid].iPages;
    RInUse.iMutex -= RMapInUse[iPid].iMutex;
}

void Banker::openAccount(int iPid, int iF, int iP, int iM)
{
    ofsLog1 << "Banker::openAccount() ";
    ofsLog1 << iPid << " " << iF << " " << iP << " " << iM << endl;
    ofsLog2 << "Banker::openAccount() ";
    ofsLog2 << iPid << " " << iF << " " << iP << " " << iM << endl;

    RMapMax[iPid].iFiles = iF;
    RMapMax[iPid].iPages = iP;
    RMapMax[iPid].iMutex = iM;

    RMapInUse[iPid].iFiles = 0;
    RMapInUse[iPid].iPages = 0;
    RMapInUse[iPid].iMutex = 0;

    ofsLog2 << "Banker::openAccount for pid " << iPid << endl;
    ofsLog2 << "...max files " << RMapMax[iPid].iFiles << endl;
    ofsLog2 << "...max pages " << RMapMax[iPid].iPages << endl;
    ofsLog2 << "...max mutex " << RMapMax[iPid].iMutex << endl;
    ofsLog2 << "...current files " << RMapInUse[iPid].iFiles << endl;
    ofsLog2 << "...current pages " << RMapInUse[iPid].iPages << endl;
    ofsLog2 << "...current mutex " << RMapInUse[iPid].iMutex << endl;

    ofsLog2 << "Banker::openAccount...RMapMax.size now " << RMapMax.size() << endl;
}

void cout3(int i1, int i2, int i3)
{
  ofsLog2 << " " << i1 << " " << i2 << " " << i3 << " ";
}

void Banker::isSafe(int iPid, int iF, int iP, int iM)
{
	// take your best shot...

}

void Banker::request(int iPid, int iF, int iP, int iM)
{
  ofsLog2 << "      Banker::request()" << iPid;
  ofsLog2 << " f " << iF << " p " << iP << " m " << iM << endl;
  ofsLog1 << "      Banker::request()" << iPid;
  ofsLog1 << " f " << iF << " p " << iP << " m " << iM << endl;

  isSafe(iPid, iF, iP, iM);

  RMapInUse[iPid].iFiles += iF;
  RMapInUse[iPid].iPages += iP;
  RMapInUse[iPid].iMutex += iM;

  RInUse.iFiles += iF;
  RInUse.iPages += iP;
  RInUse.iMutex += iM;

  ofsLog2 << "      NOW USING " << RInUse.iFiles;
  ofsLog2 << " " << RInUse.iPages;
  ofsLog2 << " " << RInUse.iMutex << endl;
  ofsLog1 << "      NOW USING " << RInUse.iFiles;
  ofsLog1 << " " << RInUse.iPages;
  ofsLog1 << " " << RInUse.iMutex << endl;
}

Banker :: ~Banker() {}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -