关于哲学家就餐问题中wait()的运用,以下这些代码是对的还是错的?是否解决了死锁问题
来源:学生作业帮 编辑:大师作文网作业帮 分类:综合作业 时间:2024/11/12 22:47:07
关于哲学家就餐问题中wait()的运用,以下这些代码是对的还是错的?是否解决了死锁问题
class Fork {
private boolean taken=false;
synchronized void put() {
taken=false;
notify();
}
synchronized void get()
throws InterruptedException {
while (taken) wait();
taken=true;
}
}
class Philosopher extends Thread {
private Fork left; private Fork right;
Philosopher(...Fork l,Fork r) {
...left = l; right = r; ...
}
public void run() {
try {
while (true) {
// thinking...
// hungry:
right.get(); left.get();
// eating...
// finished eating:
right.put(); left.put();
} } catch (InterruptedException e) {} }}
这里面一个线程会调用get()方法两次,分别去拿右边和左边的叉子,但是我总觉得这个代码有问题,当第一个线程第一次调用get()方法时会把taken值变成True,导致了这个线程在第二次调用get()方法去拿左边的叉子时进入wait状态从而没法拿左边的叉子.
class Fork {
private boolean taken=false;
synchronized void put() {
taken=false;
notify();
}
synchronized void get()
throws InterruptedException {
while (taken) wait();
taken=true;
}
}
class Philosopher extends Thread {
private Fork left; private Fork right;
Philosopher(...Fork l,Fork r) {
...left = l; right = r; ...
}
public void run() {
try {
while (true) {
// thinking...
// hungry:
right.get(); left.get();
// eating...
// finished eating:
right.put(); left.put();
} } catch (InterruptedException e) {} }}
这里面一个线程会调用get()方法两次,分别去拿右边和左边的叉子,但是我总觉得这个代码有问题,当第一个线程第一次调用get()方法时会把taken值变成True,导致了这个线程在第二次调用get()方法去拿左边的叉子时进入wait状态从而没法拿左边的叉子.
这里fork里的taken变量不是static的,所以各实例的该变量是互相独立的
因此,第一次get()之后只是right这个fork的taken被修改成true了,left仍然是false
因此,第一次get()之后只是right这个fork的taken被修改成true了,left仍然是false
关于哲学家就餐问题中wait()的运用,以下这些代码是对的还是错的?是否解决了死锁问题
关于哲学家进餐问题.我们知道操作系统中可能出现死锁的问题——哲学家进餐问题,这个问题中涉及到“筷子”.但是要知道,计算机
“哲学家就餐问题”的思路是什么?
哲学家进餐解决死锁:规定奇号哲学家先拿左边,偶数先拿右边,这样一个过程的代码对,1 2竞争1,3 4竞争3,相当于先竞争
书本上的描述是:至多只允许有四位哲学家同时去拿左边的筷子.我觉得这样并不能保证不产生死锁问题.
请解决以下关于数学的问题
艺术家还是哲学家的问题
关于操作系统 哲学家吃饭的问题 ,不需要编程,用信号量解决哲学家吃饭的原理和方法.
读刘亮程的《对一朵花微笑》解决以下问题:
写一篇关于“在暑期生活中,运用数学知识解决现实生活问题”的心得体会.
小弟用lingo求解一道站台与路口的分配问题,自己编了一段代码,以下是自己写的一窜代码
关于LINGO使用的问题,以下代码哪里有错误?无法运行啊