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

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

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

信号量

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

为了解决这个问题,一种可行的办法是对拿叉子这个过程加互斥信号量所有哲学家必须先获得拿叉子的“许可证”,然后依次拿起叉子,再释放这个“许可证”。这样就保证了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();
    }
};

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值