哲学家进餐问题

1.最多允许四个哲学家同时进餐,保证有一个筷子是空闲的,从而保证能有有一个哲学家成功进餐,而不导致死锁

cpp 复制代码
semaphore chopstick[5] = {1, 1, 1, 1, 1}, mutex=4;
Pi(){
	do{
		think...
		P(mutex);
		P(chopstick[i]);
		P(chopstick[(i+1)%5);
		eat...
		V(mutex);
		V(chopstick[i]);
		V(chopstick[(i+1)%5);
	}while(1);
}

2.给哲学家编号,要求奇数哲学家先拿左边的筷子,再拿右边的筷子,而偶数哲学家相反

cpp 复制代码
semaphore chopstick[5] = {1,1,1,1,1}; 		//初始化信号量

void philosopher(int i){
  do {
    thinking...	
    if(i%2 == 1){
      P(chopstick[i]);//判断哲学家左边的筷子是否可用
      P(chopstick[(i+1)%5]);//判断哲学家右边的筷子是否可用
    }else{
      P(chopstick[(i+1)%5]);//判断哲学家右边的筷子是否可用
      P(chopstick[i]);//判断哲学家左边的筷子是否可用
    }
    eat...
    V(chopstick[i]);
    V(chopstick[(i+1)%5]);
  }while(1);
}

3.一名哲学家左右两边的筷子均可用

时,才允许进餐

cpp 复制代码
semaphore chopstick[5] = {1, 1, 1, 1, 1},mutex=1;
Pi(){
	do{
		think...
		P(mutex); //使用一个互斥信号量,保证拿起左右两边的筷子是一气呵成的操作
		P(chopstick[i]);
		p(chopstick[(i+1)%5]);
		V(mutex);
		eating...
		V(chopstick[i]);
		V(chopstick[(i+1)%5]);
	}while(1);
}
相关推荐
Rabitebla1 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
坤坤子吖6 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
YLCHUP10 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
旖旎夜光12 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
星恒随风1 天前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
2603_969694851 天前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
可乐ea1 天前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
Go Work1 天前
两个等值条件摆着,MySQL 偏要全表扫
经验分享·笔记
Oll Correct1 天前
Adobe illustrator 案例十四:花元素标志草图绘制
笔记·ui·adobe·illustrator
每月一号准时摆烂1 天前
服务器运维笔记(一)——使用shell编写实时查看BMC功率的脚本
运维·服务器·笔记