关于银行家算法中部分代码不理解,请高手帮忙指点下谢谢!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于银行家算法中部分代码不理解,请高手帮忙指点下谢谢!!!相关的知识,希望对你有一定的参考价值。

class pcb
public:
int p_pid;
int p_stat;
int p_apply;
int p_occupy;
bool p_issuc;
int p_require;
pcb(int id,int require)

p_pid = id;
p_require = require;
p_stat = TASK_RUNNING;
p_occupy = 0;
p_issuc = false;
p_apply = 0;

friend ostream & operator <<(ostream &cout,const pcb & p)

cout<<p.p_pid<<'\t'<<p.p_stat<<'\t'<<p.p_require<<'\t'<<p.p_occupy
<<endl;

return cout;

;
此类中的构造函数只有一个而且形参参数是两个整形数据,但程序中其他地方出现语句:
pcb proc(*p);
这是怎么一回事啊。
完整程序绝对能运行,由于代码太多所以就没全部粘上来。有知道的帮忙解释下。谢谢先!!!

lass ThreadTest
static int type = 4, num = 10; //定义资源数目和线程数目
static int[] resource = new int[type]; //系统资源总数
//static int[] copyResource = new int[type]; //副本
static Random rand = new Random();
static Bank[] bank = new Bank[num]; //线程组
Bank temp = new Bank();

public void init()
//初始化组中每个线程,随机填充系统资源总数
for(int i = 0; i < type; i++)
resource[i] = rand.nextInt(10) + 80;
System.out.print("Resource:");
for(int i = 0; i < type; i++)
System.out.print(" " + resource[i]);
System.out.println("");
for(int i = 0; i < bank.length; i++)
bank[i] = new Bank("#" + i);

public ThreadTest4()
init();


class Bank extends Thread
//银行家算法避免死锁
public int[]
max = new int[type], //总共需求量
need = new int[type], //尚需资源量
allocation = new int[type]; //已分配量
private int[]
request = new int[type], //申请资源量
copyResource = new int[type]; //资源副本
private boolean isFinish = false; //线程是否完成
int[][] table = new int[bank.length][type*4]; //二维资源分配表

private void init()
// 随机填充总共、尚需、已分配量
synchronized(resource)
for(int i = 0; i < type; i++)
max[i] = rand.nextInt(5) + 10;
need[i] = rand.nextInt(10);
allocation[i] = max[i] - need[i];
resource[i] -= allocation[i]; //从系统资源中减去已分配的

printer();
for(int i = 0; i < type; i++)
if(resource[i] < 0)
//若出现已分配量超出系统资源总数的错误则退出
System.out.println("The summation of Threads' allocations is out of range!");
System.exit(1);





public Bank(String s)
setName(s);
init();
start();

public Bank()
//none


public void run()
try
sleep(rand.nextInt(2000));

catch(InterruptedException e)
throw new RuntimeException(e);

while(true)
//程序没有完成时一直不断申请资源
if(askFor() == false)
try
sleep(1000);

catch(InterruptedException e)
throw new RuntimeException(e);


else
tryRequest();
if(noNeed() == true)
break;

//休眠一段时间模拟程序运行
try
sleep(1000);

catch(InterruptedException e)
throw new RuntimeException(e);

System.out.println(getName() + " finish!");
synchronized(resource)
//运行结束释放占有资源
for(int i = 0; i < type; i++)
resource[i] += allocation[i];
need[i] = allocation[i] = max[i] = 0;




private void printer()
//打印当前资源信息
System.out.print(getName() + " Max:");
for(int i = 0; i < type; i++)
System.out.print(" " + max[i]);
System.out.print(" Allocation:");
for(int i = 0; i < type; i++)
System.out.print(" " + allocation[i]);
System.out.print(" Need:");
for(int i = 0; i < type; i++)
System.out.print(" " + need[i]);
System.out.print(" Available:");
for(int i = 0; i < type; i++)
System.out.print(" " + resource[i]);
System.out.println("");

private boolean askFor()
//随机产生申请资源量并检测是否超标
boolean canAsk = false;
for(int i = 0; i < type; i++)
request[i] = rand.nextInt(20);
//防止申请量超过所需量
if(request[i] > need[i])
request[i] = need[i];

for(int i = 0; i < type; i++) //防止随机申请资源全为0
if(request[i] > 0)
canAsk = true;
synchronized(resource)
//锁住可供资源检查是否超标
for(int i = 0; i < type; i++)
if(request[i] > resource[i])
//如果申请资源超过可供资源则等待一段时间后重新申请
return false;


return canAsk;

private void tryRequest()
//创建副本尝试分配请求
synchronized(resource)
for(int i = 0; i < type; i++)
//依然要防止请求量超出范围
if(request[i] > resource[i])
return;
for(int i = 0; i < type; i++)
//复制资源量并减去需求量到一个副本上
copyResource[i] = resource[i];
copyResource[i] -= request[i];

System.out.print(getName() + " ask for:");
for(int i = 0; i < type; i++)
System.out.print(" " + request[i]);
System.out.println("");
if(checkSafe() == true)
//如果检查安全则将副本值赋给资源量并修改占有量和需求量
for(int i = 0; i < type; i++)
resource[i] = copyResource[i];
allocation[i] += request[i];
need[i] -= request[i];

System.out.println(getName() + " request succeed!");

else
System.out.println(getName() + " request fail!");


private boolean checkSafe()
//银行家算法检查安全性
synchronized(bank)
//将线程资源信息放入二维资源分配表检查安全性,0~type可用资源/type~type*2所需资源/type*2~type*3占有资源/type*3~-1可用+占用资源
for(int i = 0; i < bank.length; i++)
for(int j = type; j < type*2; j++)
table[i][j] = bank[i].need[j%type];

for(int j = type*2; j < type*3; j++)
table[i][j] = bank[i].allocation[j%type];


//冒泡排序按需求资源从小到大排
for(int i = 0; i < bank.length; i++)
for(int j = i; j < bank.length-1; j++)
sort(j, 4);


//进行此时刻的安全性检查
for(int i = 0; i < type; i++)
table[0][i] = copyResource[i];
table[0][i+type*3] = table[0][i] + table[0][i+type*2];
if(table[0][i+type*3] < table[1][i+type])
return false;

for(int j = 1; j < bank.length-1; j++)
for(int k = 0; k < type; k++)
table[j][k] = table[j-1][k+type*3];
table[j][k+type*3] = table[j][k] + table[j][k+type*2];
if(table[j][k+type*3] < table[j+1][k+type])
return false;



return true;

private void sort(int j, int k)
//递归冒泡排序
int tempNum;
if(table[j][k] > table[j+1][k])
for(int i = type; i < type*2; i++)
tempNum = table[j][i];
table[j][i] = table[j+1][i];
table[j+1][i] = tempNum;

/*temp = bank[j];
bank[j] = bank[j+1];
bank[j+1] = temp;*/

else if(table[j][k] == table[j+1][k] && k < type*2) //此资源量相同时递归下一个资源量排序并且防止超出范围
sort(j, k+1);

private boolean noNeed()
//是否还需要资源
boolean finish = true;
for(int i = 0; i < type; i++)
if(need[i] != 0)
finish = false;
break;


return finish;



public static void main(String[] args)
ThreadTest t = new ThreadTest();
//后台线程,设定程序运行多长时间后自动结束
new Timeout(30000, "---Stop!!!---");

追问

虽然你给了这么一段代码,担不是我想要的问题的结果。。。没办法不能给你最优答案

参考技术A pcb proc(*p);
只看这一句的话.
猜测 proc 是一个函数指针.
这一语句是调用一个函数.(函数由 proc 指向 )
并且函数返回一个pcb 类的对象. 这里与类的构造函数无关.

你应该看看 proc 被赋于什么值. 它就是所调用的函数.
或者你看看函数指针的相关内容.追问

你没有回答我的问题哦。proc是类pcb的一个对象,pcb proc(*p);对该对象初始化,我想知道没有相应的构造函数,为什么能够这样定义对象...

关于c# MessageBox.Show错误 高手指点下

在vs2005调试时 MessageBox.Show("除数为零,非法操作!");
提示错误:错误 CS1002: 应输入 ;
错误 CS1525: 无效的表达式项“.”
怎么回事啊 高手指点下 好的话加分

参考技术A 应该是上一行有错误,多个点,或者语句没有写完 参考技术B 这句代码没错,肯定是别的地方错的才导致这个错。VS报错不一定都准确,你将完整代码贴上来看一下。本回答被提问者采纳 参考技术C 代码不够哈! 不能不是那个地方报错 贴上完整代码!

参考资料:回答即可得两分,帮人就是帮自己!

以上是关于关于银行家算法中部分代码不理解,请高手帮忙指点下谢谢!!!的主要内容,如果未能解决你的问题,请参考以下文章

关于c# MessageBox.Show错误 高手指点下

Thread.sleep(1)为啥不起作用?请高手帮忙分析!

正则表达式c语言匹配汉字“银行”,怎么写啊???直接写“银行”匹配不出来,麻烦高手指点下,很急的

数据结构关于串的KMP算法的理解高手请进

利用c++ 做二十四点游戏。请高手们帮忙!谢谢

数据库高手请进——关于银行储蓄系统问题?