哲学家就餐
哲学家从 0 到 4 按 顺时针 编号。请实现函数 void wantsToEat(philosopher, pickLeftFork, pickRightFork, eat, putLeftFork, putRightFork):
philosopher 哲学家的编号。
pickLeftFork 和 pickRightFork 表示拿起左边或右边的叉子。
eat 表示吃面。
putLeftFork 和 putRightFork 表示放下左边或右边的叉子。
由于哲学家不是在吃面就是在想着啥时候吃面,所以思考这个方法没有对应的回调。
给你 5 个线程,每个都代表一个哲学家,请你使用类的同一个对象来模拟这个过程。在最后一次调用结束之前,可能会为同一个哲学家多次调用该函数。
来源:力扣(LeetCode)
链接:添加链接描述
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
别人的代码,我加了注释
class Semaphore {
public:
Semaphore(int count = 0) : count_(count) {
}
void Set(int count){
count_ = count; //初始化资源数
}
void Signal() {
std::unique_lock<std::mutex> lock(mutex_);
++count_;
cv_.notify_one(); //每次释放一个资源发出一个通知信号
}
void Wait() {
std::unique_lock<std::mutex> lock(mutex_);
while(count_ <= 0){ //当没有资源时,加锁
cv_.wait(lock);//等待解锁信号
}
--count_;
}
private:
std::mutex mutex_;
std::condition_variable cv_;
int count_;
};
class DiningPhilosophers {
public:
DiningPhilosophers() {
guid.Set(4);
}
void wantsToEat(int philosopher,
function<void()> pickLeftFork,
function<void()> pickRightFork,
function<void()> eat,
function<void()> putLeftFork,
function<void()> putRightFork) {
int l = philosopher;
int r = (philosopher+1)%5;
guid.Wait(); //最多四个哲学家同时进场
lock[l].lock(); //每个筷子互斥使用
lock[r].lock();
pickLeftFork();
pickRightFork();
eat();
putRightFork();
putLeftFork();
lock[r].unlock();
lock[l].unlock();
guid.Signal(); //进餐结束,释放资源
}
private:
std::mutex lock[5];
Semaphore guid;
};
作者:mike-meng
链接:https://leetcode-cn.com/problems/the-dining-philosophers/solution/zhe-xue-jia-jiu-can-wen-ti-by-mike-meng/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。