哲学家进餐问题

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);
}
相关推荐
暗然而日章11 分钟前
C++基础:Stanford CS106L学习笔记 7 类
c++·笔记·学习
思成不止于此14 分钟前
【MySQL 零基础入门】DDL 核心语法全解析:数据库与表结构操作篇
数据库·笔记·学习·mysql
lkbhua莱克瓦2420 分钟前
Java进阶——IO流
java·开发语言·笔记·学习方法·io流
浦东新村轱天乐24 分钟前
2025.12.01-2025.12.07:休假回来,开始迭代vlm
笔记
im_AMBER27 分钟前
Leetcode 72 数组列表中的最大距离
c++·笔记·学习·算法·leetcode
FFF团团员90930 分钟前
树莓派学习笔记7:局域网的建立和程序自启动
笔记·学习
码以致用1 小时前
Kafka笔记
笔记·分布式·kafka
kkkkkkkkk_12012 小时前
【强化学习】05周博磊强化学习纲要学习笔记——第三课上
笔记·学习·强化学习
淳杰2 小时前
【Androidstudio】学习/采坑笔记-冷重启和热重启(reboot)
笔记·学习
思成不止于此3 小时前
MySQL 数据操作:增删改核心语法全解析
数据库·笔记·学习·mysql