代码拉取完成,页面将自动刷新
#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;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。