2020-08-20 ゞ 浴缸里的玫瑰 2022-11-29 12:30 11阅读 0赞 [原文][Link 1] 哲学家就餐 哲学家从 0 到 4 按 顺时针 编号。请实现函数 void wantsToEat(philosopher, pickLeftFork, pickRightFork, eat, putLeftFork, putRightFork): philosopher 哲学家的编号。 pickLeftFork 和 pickRightFork 表示拿起左边或右边的叉子。 eat 表示吃面。 putLeftFork 和 putRightFork 表示放下左边或右边的叉子。 由于哲学家不是在吃面就是在想着啥时候吃面,所以思考这个方法没有对应的回调。 给你 5 个线程,每个都代表一个哲学家,请你使用类的同一个对象来模拟这个过程。在最后一次调用结束之前,可能会为同一个哲学家多次调用该函数。 来源:力扣(LeetCode) 链接:[添加链接描述][Link 2] 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 别人的代码,我加了注释 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) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 [Link 1]: https://leetcode-cn.com/problems/the-dining-philosophers/solution/zhe-xue-jia-jiu-can-wen-ti-by-mike-meng/ [Link 2]: https://leetcode-cn.com/problems/the-dining-philosophers
还没有评论,来说两句吧...