力扣1226. 哲学家进餐(信号量)

力扣1226. 哲学家进餐(信号量)

https://leetcode-cn.com/problems/the-dining-philosophers/

力扣1226. 哲学家进餐(信号量)

力扣1226. 哲学家进餐(信号量)

信号量

假设每个哲学家都先拿左手的叉子,再拿右手的叉子,那么就有可能出现五个哲学家都拿起左手的叉子,且都拿不了右手的叉子的情况。

为了解决这个问题,一种可行的办法是对拿叉子这个过程加互斥信号量,所有哲学家必须先获得拿叉子的“许可证”,然后依次拿起叉子,再释放这个“许可证”。这样就保证了DeadLock Free。

#include <semaphore.h>
class DiningPhilosophers {
public:
    sem_t mutex;
    sem_t chopstick[5];
    DiningPhilosophers() {
        sem_init(&mutex,0,1);
        sem_init(&chopstick[0],0,1);
        sem_init(&chopstick[1],0,1);
        sem_init(&chopstick[2],0,1);
        sem_init(&chopstick[3],0,1);
        sem_init(&chopstick[4],0,1);
    }

    void wantsToEat(int philosopher,
                    function<void()> pickLeftFork,
                    function<void()> pickRightFork,
                    function<void()> eat,
                    function<void()> putLeftFork,
                    function<void()> putRightFork) {
		sem_wait(&mutex);
        sem_wait(&chopstick[philosopher]);
        pickLeftFork();
        sem_wait(&chopstick[(philosopher+1)%5]);
        pickRightFork();
        sem_post(&mutex);
        eat();
        sem_post(&chopstick[philosopher]);
        putLeftFork();
        sem_post(&chopstick[(philosopher+1)%5]);
        putRightFork();
    }
};

 

上一篇:哲学家就餐问题


下一篇:操作系统——2.2-3经典进程的同步问题