#include<Windows.h>
#include<iostream>
#include<string>
#include<thread>
#include<mutex>
using namespace std;
std::mutex mu;
std::mutex chopsticks[5];
const char THINKING = 0;
const char WAITING = 1;
const char EATING = 2;
class philosopher {
public:
philosopher(int n) { status = THINKING; number = n; }
~philosopher() { };
int can_eat() {
philosopher left = philosopher((number + 1) % 5);
philosopher right = philosopher((number + 4) % 5);
if (left.get_status() != EATING && right.get_status() != EATING && status==WAITING)
return 1;
return 0;
}
void eat() {
chopsticks[number % 5].lock();
chopsticks[(number + 1) % 5].lock();
status = EATING;
Sleep(1000);
}
void put_down_chopsticks() {
status = THINKING;
chopsticks[number % 5].unlock();
chopsticks[(number + 1) % 5].unlock();
}
int get_status() { return status; }
int get_number() { return number; }
void set_status(int s) { status = s; }
private:
int status;
int number;
};
philosopher* ph_1 = new philosopher(0);
philosopher* ph_2 = new philosopher(1);
philosopher* ph_3 = new philosopher(2);
philosopher* ph_4 = new philosopher(3);
philosopher* ph_5 = new philosopher(4);
void show() {
mu.lock();
cout << "===============" << endl;
cout << ph_1->get_number() << ":" << ph_1->get_status() << endl;
cout << ph_2->get_number() << ":" << ph_2->get_status() << endl;
cout << ph_3->get_number() << ":" << ph_3->get_status() << endl;
cout << ph_4->get_number() << ":" << ph_4->get_status() << endl;
cout << ph_5->get_number() << ":" << ph_5->get_status() << endl;
mu.unlock();
}
void try_to_eat(philosopher *p) {
while (1) {
switch (p->get_status()) {
case THINKING:
Sleep(2000);
p->set_status(WAITING);
break;
case WAITING:
if (p->can_eat())
{
p->eat();
}
else{
p->set_status(WAITING);
}
break;
case EATING:
p->put_down_chopsticks();
break;
default:
break;
}
show();
}
}
int main() {
std::thread t1(try_to_eat, ph_1);
std::thread t2(try_to_eat, ph_2);
std::thread t3(try_to_eat, ph_3);
std::thread t4(try_to_eat, ph_4);
std::thread t5(try_to_eat, ph_5);
show();
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
return 0;
}
操作系统并发和互斥:哲学家进餐问题和理发师问题
1. 哲学家进餐问题:
(1) 在什么情况下5 个哲学家全部吃不上饭?
考虑两种实现的方式,如下:
A.
算法描述:
void philosopher(int i) /*i:哲学家编号,从0 到4*/
{
while (TRUE) {
think( ); /*哲学家正在思考*/
take_fork(i)......
答案就在这里:关于哲学家进餐问题
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?
你想问的问题呢?这段程序有什么不对吗?