• 大小: 3KB
    文件类型: .cpp
    金币: 2
    下载: 0 次
    发布日期: 2023-12-04
  • 语言: C/C++
  • 标签: 操作系统  

资源简介

哲学家进餐问题的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);   //释放左边信号量  

评论

共有 条评论