zoukankan      html  css  js  c++  java
  • IPC之哲学家进餐问题

    A问题:

      1965年,Dijkstra提出并解决了一个他称之为哲学家进餐的同步问题。

       “五个哲学家围坐在一张圆桌周围,每个哲学家的前面都有一份通心面,由于面条很滑,必须使用2把叉子才能夹住。相邻2份通心面之间有1把叉子。哲学家的生活包括:吃饭、思考。当哲学家感觉饿了,他就试图分2次取他左右的叉子,每次拿1把,但不分次序。如果成功获得2把叉子,则开始吃饭,吃完放下叉子继续思考。”

      问题要求不能死锁。

    A解决:

      

    #define N 5
    #define LEFT (i+N-1)%N
    #define RIGHT (i+1)%N
    #define THINKING 0
    #define HUNGRY 0
    #define EATING 2
    typedef int semaphore;
    int state[N];
    semaphore mutex=1;
    semaphore s[N];
    void philosopher(int i)
    {
        while(TRUE)
        {
            think();
            take_forks(i);
            eat();
            put_forks(i);  
        }
    }
    
    void take_forks(int i)
    {
        down(&mutex);
        state[i] = HUNGRY;
        test(i);
        up(&mutex);
        down(&s[i]);
    }
    
    void put_forks(int i)
    {
        down(&mutex);
        state[i] = THINKING;
        test(LEFT);
        test(RIGHT);
        up(&mutex);
    }
    
    void test(i)
    {
        if(state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT != EATING])
        {
            up(&s[i]);
        }
    
    }
    

    访问哲学家状态数组时进行互斥

    当前哲学家饿了,且左右哲学家都没有进餐时,设置信号量。

    之后根据信号量(是否设置过)进行确定是否阻塞。

  • 相关阅读:
    django之数据库orm
    Python的迭代器和生成器
    xhprof 安装使用
    http_load
    sysbench
    LINUX系统下MySQL 压力测试工具super smack
    apache ab工具
    关于流量升高导致TIME_WAIT增加,MySQL连接大量失败的问题
    mysql5.6优化
    php-fpm超时时间设置request_terminate_timeout分析
  • 原文地址:https://www.cnblogs.com/pokerface/p/8901772.html
Copyright © 2011-2022 走看看