哲学家进餐问题(c++11自己实现semaphore)

博客介绍了在C++11中由于缺乏内置的semaphore,如何利用mutex和condition_variable实现semaphore,并以此解决操作系统中的经典问题——哲学家进餐问题。文中提出了三种解决方案,包括限制进餐人数、特定的叉子获取顺序以及限定就餐策略,并详细阐述了第三种策略——奇数偶数哲学家交替拿取筷子的方法,确保不会出现哲学家饿死的情况。
摘要由CSDN通过智能技术生成

首先c++11只有mutex与condition_variable这两个条件,是没有semaphore这个玩意的,因此借助mutex与condition_variable自己实现一个semaphore,然后解决os当中的哲学家进餐问题。
首先实现semaphore

class Semaphore
{
   
public:
Semaphore(int count =0):count(count)
{
   }
void Set(int n)
{
   
	count=n;
}
void Signal()
{
   
	unique_lock<mutex> lck(m_mutex);
	count++;
	cv.notify_all();
}
void Wait()
{
   
	unique_lock<mutex> lck(m_mutex);
	if(count<=0)
		cv.wait(lck);
	count--;
}

private:
mutex m_mutex;
condition_variable cv;
int count;
};

上述为实现的semaphore方法;
则如何解决哲学家进餐问题呢?

5 个沉默寡言的哲学家围坐在圆桌前,每人面前一盘意面。叉子放在哲学家之间的桌面上。(5 个哲学家,5 根叉子)

所有的哲学家都只会在思考和进餐两种行为间交替。哲学家只有同时拿到左边和右边的叉子才能吃到面,而同一根叉子在同一时间只能被一个哲学家使用。每个哲学家吃完面后都需要把叉子放回桌面以供其他哲学家吃面。只要条件允许,哲学家可以拿起左边或者右边的叉子,但在没有同时拿到左右叉子时不能进食。

假设面的数量没有限制,哲学家也能随便吃,不需要考虑吃不吃得下。

设计一个进餐规则(并行算法)使得每个哲学家都不会挨饿;也就是说,在没有人知道别人什么时候想吃东西或思考的情况下,每个哲学家都可以在吃饭和思考之间一直交替下去。

在这里插入图片描述
三种实现方法:
1、限制进餐人数

class DiningPhilosophers {
   
public:
    DiningPhilosophers(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值