热爱学习的呆萌的文青 2016-01-11 02:58 采纳率: 54.8%
浏览 2269

C++ 关于哲学家进餐问题求教??

#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;
}

图片说明

  • 写回答

2条回答 默认 最新

  • Robot-S 2016-01-11 03:00
    关注

    操作系统并发和互斥:哲学家进餐问题和理发师问题 

    1. 哲学家进餐问题: 
    (1) 在什么情况下5 个哲学家全部吃不上饭? 
    考虑两种实现的方式,如下: 
    A. 
    算法描述: 
    void philosopher(int i) /*i:哲学家编号,从0 到4*/ 

    while (TRUE) { 
    think( ); /*哲学家正在思考*/ 
    take_fork(i)......
    答案就在这里:关于哲学家进餐问题
    ----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

    评论

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥15 如何修改pca中的feature函数
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况