加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
philosophers.cpp 2.18 KB
一键复制 编辑 原始数据 按行查看 历史
chq666666 提交于 2022-01-11 12:08 . first
#include<iostream>
#include<thread>
#include<mutex>
#include<ctime>
#include <semaphore.h>
using namespace std;
using namespace std::this_thread;
using namespace std::chrono;
sem_t eat_mutex, eat_mutex2;
//用五个互斥量表示五支叉子
mutex fork[5];
//用一个规模为5的整型数组来表示每个盘子剩余的面条
int nuddles[5] = { 50,50,50,50,50 };
void eat(int id){
printf("哲学家%d开始吃面条!\n", id + 1);
srand((unsigned)time(NULL));
int numbereated = rand() % 50;
sleep_for(seconds(numbereated % 5));//吃一段时间
nuddles[id] -= numbereated;
}
void think(int x){
sleep_for(milliseconds(x));
}
void philosopher(int id) { //策略一原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,
//最终总会释放出他所使用过的两支筷子从而可使更多的哲学家进餐。
//定义信号量,只允许4个哲学家同时进餐,这样就能保证至少有一个哲学家可以就餐。
while (true) {//尝试同时拿起左手边和右手边的叉子
sem_wait(&eat_mutex);
if (fork[id].try_lock()) {//先尝试拿起左手边的叉子 如果能拿起左手边的叉子,再拿右手边的
if (fork[(id + 1) % 5].try_lock()) {//如果也能拿起右手边的叉子,吃面条
eat(id);
if (nuddles[id] <= 0){
printf(" 哲学家%d吃完了他的所有面条!\n", id+1);
fork[id].unlock();
fork[(id + 1) % 5].unlock();
sem_post(&eat_mutex);
break;
}
printf("哲学家%d吃完,面条剩余%d!\n", id+1, nuddles[id]);
fork[id].unlock();
fork[(id + 1) % 5].unlock();
think(200);
}
else {//如果没办法拿起右手边的叉子,记得要把左手边的叉子放下来
fork[id].unlock();
think(100);
}
}
sem_post(&eat_mutex);
}
}
int main()
{
sem_init(&eat_mutex,0,4);
sem_init(&eat_mutex2,0,1);
printf("开始吃饭!每人拥有50面条\n");
thread t1(philosopher, 0);
thread t2(philosopher, 1);
thread t3(philosopher, 2);
thread t4(philosopher, 3);
thread t5(philosopher, 4);
t1.join(); t2.join(); t3.join(); t4.join(); t5.join();
printf("所有哲学家吃完!\n");
return 0;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化