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

问题描述

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

解决方案

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

1. 哲学家进餐问题:?
(1) 在什么情况下5 个哲学家全部吃不上饭??
考虑两种实现的方式,如下:?
A.?
算法描述:?
void philosopher(int i) /*i:哲学家编号,从0 到4*/?
{?
while (TRUE) {?
think( ); /*哲学家正在思考*/?
take_fork(i)......
答案就在这里:关于哲学家进餐问题

解决方案二:

你想问的问题呢?这段程序有什么不对吗?

时间: 2024-09-16 00:17:46

c++-C++ 关于哲学家进餐问题求教??的相关文章

几个分布式基础算法

研究生期间分布式课程的小结吧.... 中间件在分布式系统中的地位和角色 为了使种类各异的计算机和网络都呈现为单个的系统,分布式系统常常通过一个"软件层"组织起来,该层在逻辑上位于由用户和应用程序组成的高层与由操作系统组成的低层之间,这样的分布式系统又称为中间件.中间件层延伸到了多台机器上,且为每个应用程序提供了相同的接口.它的重要的目的是提供一定程度的透明性,也就是一定程度上向应用程序隐藏数据处理的分布性.中间件集分布式操作系统与网络操作系统的优点于一身,既能够具有网络操作系统的可扩展

漫谈C++ Builder多线程编程技术

摘 要:本文简单介绍了Windows环境下进行多线程编程的意义,重点讨论了C++Builder环境下开发多线程应用程序这一问题,并通过实现生产者-消费者问题,帮我们更好地理解同步概念及其实现方法. 关键词:多线程:同步:生产者-消费者:C++Builder 线程之可行性 在很多情况下,可能需要为程序创建线程.这里给出其中一些可能性: (1)如果创建的是一个多文档接口(Multiple Document Interface,MDI)程序,那么为每个窗口分配一个线程就显得十分重要了,例如,对于一个通

白话阿里巴巴Java开发手册(编程规约)

最近,阿里巴巴发布了<阿里巴巴Java开发手册>,总结了阿里人多年一线实战中积累的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过限制开发人员的编程风格.实现方式来避免研发人员在实践中容易犯的错误,同样的问题大家使用同样的模式解决,便于后期维护和扩展,确保最终在大规模协作的项目中达成既定目标. 无独有偶,笔者去年在公司里负责升级和制定研发流程.设计模板.设计标准.代码标准等规范,并在实际工作中进行了应用和推广,收效颇丰,也总结了适合支付平台的技术规范,由于阿里巴巴Java

GCD深入理解(二)

转自@nixzhu的GitHub主页(译者:Riven.@nixzhu),原文<Grand Central Dispatch In-Depth: Part 2/2>   欢迎来到GCD深入理解系列教程的第二部分(也是最后一部分).   在本系列的第一部分中,你已经学到超过你想像的关于并发.线程以及GCD 如何工作的知识.通过在初始化时利用 dispatch_once,你创建了一个线程安全的 PhotoManager 单例,而且你通过使用 dispatch_barrier_async 和 dis

进程管理3--经典的进程同步问题

管程机制 用信号量机制实现进程间的同步和互斥,既方便又有效.但存在以下两个问题: 每个访问临界资源的进程都必须自备同步操作(P.V操作),这使大量的同步操作分散在各个进程中,给系统的管理带来麻烦. 会因同步操作使用不当而导致系统死锁. 解决方法: 管程(Monitors) Dijkstra于1971年提出:为每个共享资源设立一个"秘书"来管理对它的访问.  一切来访者都要通过秘书,而秘书每次仅允许一个来访者(进程)来访问共享资源.这样既便于系统管理共享资源,又能保证进程的互斥访问和同步

权威发布15个顶级Java多线程面试题及回答

在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并发的.下面这些是我在不同时间不同地点喜欢问的Java线程问题.我没有提供答

2010年计算机基础综合 考试大纲

2010年计算机基础综合 考试大纲 2010年计算机基础综合 考试大纲请大家支持高教正版图书! 任何组织和个人无权将其用于任何商业赢利为目的的 2010年计算机基础综合考试大纲 2010年计算机基础综合考试大纲 计算机学科专业基础综合考试涵盖数据机构.计算机组成原理.操作系统和计算机网络等学科专业基础课程.要求考生比较系统地掌握上述专业基础课程的概念.基本原理和方法,能够运用所学的基本原理和基本方法分析.判断和解决有关理论问题和实际问题. Ⅱ考试形式和试卷结构 一.试卷满分及考试时间本试卷满分为

转载:2016.3.15 回忆录

问题一: 初次见面,先手写一段二分查找的算法吧,假定数组是由大到小排序的! 答: 二分查找,别名折半查找.其思想很简单,标准写法如下: //有序数组递减排列 int binarySearch(int* array,int len,int value){ int mid=0; int low=0; int high=len-1; while(low<=high){ mid=(low+high)/2; if(array[mid]>value){ //在右半区 low=mid+1; continue

操作系统概念学习笔记 12 进程同步(二)管程

操作系统概念学习笔记 12 进程同步(二) 管程 基本的.高级的同步构造,即管程(monitor)类型. 使用: 管程类型提供了一组由程序员定义的.在管程内互斥的操作.管程类型的表示包括一组变量的声明(这些变量的值定义了一个类型实例的状态)和对这些变量操作的子程序和函数的实现.管程的类型表示不能直接为各个进程所使用.因此,在管程内定义的子程序只能访问位于管程内那些局部声明的变量和形式参数.类似的,管程的局部变量能被局部子程序访问. 管程结构确保一次只有一个进程能在管程内活动.不需要显示的编写同步