资源简介
哲学家进餐问题的c++模拟实现,避免死锁的方法是奇数号哲学家先拿右边的筷子,偶数号先那左边的筷子,有详尽的注释。
代码片段和文件信息
/*
哲学家进餐问题
规定:奇数号哲学家先拿起右边筷子,然后再去拿左边筷子,而偶数号哲学家相反
目的:防止死锁
*/
#include
#include
#include
using namespace std;
#define NUM 5 //哲学家和筷子数目
mutex mtx;
int sequence[5];//用于保存进餐顺序
int m = 0;
bool chopstick[5] = {11111};//记录型信号量
int semaphore = 5;//设置信号量
void show()
{//显示shopstick[]的状态
mtx.lock();
for (int i = 0; i < 5; i++)
{
cout << chopstick[i];
}
cout << endl;
mtx.unlock();
}
void P(int i)
{
/*if (chopstick[i]==0)
{//信号量小于0则中断
this_thread::sleep_for(chrono::seconds(1));
}
else
{
chopstick[i] = 0;//设置i号筷子为不可用
semaphore--;//信号量减一
}
*/
while (chopstick[i] == 0)
{//如果拿不到筷子就进入等待队列
this_thread::sleep_for(chrono::seconds(1));
}
chopstick[i] = 0;//设置i号筷子为不可用
semaphore--;//信号量减一
//show();
}
void V(int i)
{
chopstick[i] = 1;//设置i号筷子为可用
semaphore++;
//show();
}
void think(int i)
{
cout << i << “ 号哲学家陷入了思考。“ << endl;
}
void eat(int i)
{
mtx.lock();
cout << i << “ 号哲学家在进餐。“ << endl;
mtx.unlock();
}
void meal(int i)
{
if (i % 2 == 0) //偶数号哲学家
{
P(i); //拿起左边的筷子
//mtx.lock();
cout << i << “ 号哲学家拿起了左边的筷子。“ << endl;
//mtx.unlock();
P((i + 1) % 5);//拿起右边的筷子
//mtx.lock();
cout << i << “ 号哲学家拿起了右边的筷子。“ << endl;
//mtx.unlock();
eat(i); //左右都得到筷子则吃饭
V(i); //释放左边信号量
- 上一篇:基于图像的二代身份证识别
- 下一篇:毕业设计C++五子棋源代码及毕业论文
相关资源
- 操作系统课程设计(生产者-消费者存
- 操作系统——5个实验.zip
- 操作系统进程管理实验
- 操作系统—页面置换算法C++实现
- 操作系统 内存管理 模拟 图形界面
- 银行家算法 mfc 含源代码 界面 操作系
- 操作系统生产者消费者问题MFC动态实
- 操作系统课程设计:Windows 命令接口之
- 操作系统课程大作业-文件管理系统
- C语言实现最低松弛度优先算法源代码
- 操作系统信号量PV经典问题:沉睡的理
- 基于C++的银行家算法模拟实现
- 生产者消费者问题源码-MFC实现-进程模
- 操作系统实验 进程调度 高响应比优先
- 操作系统文件管理C++代码实现
- 嗜睡的理发师进程同步与实现c++
- 安徽大学操作系统实验八基于扫描的
- 安徽大学操作系统实验四主存空间的
- 操作系统——银行家算法
- 操作系统_生产者消费者c++、mfc实现
- 磁盘调度c++模拟实现计算机操作系统
- 操作系统课设源代码 模拟进程的并
- 64位操作系统下win10、win7,VC6的所有问
- 操作系统课程设计之死锁检测
- 操作系统课程设计 哲学家进餐问题完
- 2010-2011华南理工大学操作系统课程设
- 操作系统进程间通信,用mfc实现
- 2013-2014华南理工大学操作系统课程设
- 操作系统实验 请求分页存储管理(包
- 进程/作业调度:时间片轮转调度算法
评论
共有 条评论