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

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

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

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

  • 相关阅读:
    CSS学习笔记 -- 组合选择符
    CSS学习笔记 -- Position(定位)
    CSS学习笔记 -- CSS 列表
    CSS学习笔记 -- 多重样式优先级深入概念
    CSS学习笔记 -- ID和Class
    HTML学习笔记 -- XHTML
    HTML学习笔记 -- 速查列表
    HTML学习笔记 -- <div> 和<span>
    HTML学习笔记 -- HTML <head>
    HTML学习笔记 -- HTML 中 href、src 区别
  • 原文地址:https://www.cnblogs.com/pokerface/p/8901772.html
Copyright © 2011-2022 走看看