力扣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();
}
};