哲学家进餐问题的C语言实现
创作时间:
作者:
@小白创作中心
哲学家进餐问题的C语言实现
引用
CSDN
1.
https://blog.csdn.net/c3091158291/article/details/144381905
“哲学家进餐问题”是一个经典的同步与并发编程问题,由艾尔弗雷德·阿尔维和丹尼斯·里奇在20世纪70年代提出,旨在探讨资源共享和互斥的问题。该问题主要涉及五位哲学家围坐在一张圆桌上,他们在思考和进餐之间交替进行。每位哲学家面前有一根筷子(或叉子),而吃饭需要同时握住左右两根筷子。这个问题强调了以下几点:
- 资源竞争:每位哲学家都需要访问共享资源(筷子),可能会导致资源竞争和死锁。
- 同步与互斥:确保在任何时刻只有一位哲学家能使用筷子,同时避免死锁,即所有哲学家都在等待彼此释放筷子,无法继续。
- 解决死锁方案:该问题有多种解决方案,如引入一个外部的“管家”来控制筷子的使用,或通过改变哲学家的取餐顺序来减少死锁的可能性。
本文通过控制哲学家同时进餐的人数不超过人数减一(4)来确定:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <windows.h> // 包含 Sleep 函数
#include <time.h>
#define NUM_PHILOSOPHERS 5
#define NUM_CHOPSTICK 5
sem_t chopstick[NUM_CHOPSTICK]; // 筷子信号量
sem_t count; // 设置一个count
void* philosopher(void* num) {
int philosopher_number = *(int*)num; // 将 void* 转换为 int*,因为在create_pthread时传入参数类型只能是void*
sem_wait(&count); //请求进入房间进餐 当count为0时 不能允许哲学家再进来了
printf("第%d个哲学家正在尝试拿左边的筷子...\n", philosopher_number);
sem_wait(&chopstick[philosopher_number - 1]);
printf("第%d个哲学家成功拿到左边的筷子...\n", philosopher_number);
printf("第%d个哲学家正在尝试拿右边的筷子...\n", philosopher_number);
sem_wait(&chopstick[philosopher_number % 5]); // 先拿左边再拿右边
printf("第%d个哲学家成功拿到右边的筷子...\n", philosopher_number);
printf("第%d个哲学家正在进餐...\n", philosopher_number);
Sleep(2000);
sem_post(&chopstick[philosopher_number - 1]);
sem_post(&chopstick[philosopher_number % 5]); // 先放左边再放右边
sem_post(&count); //离开饭桌释放信号量
printf("第%d个哲学家继续思考...\n", philosopher_number);
return NULL; // 添加返回值
}
int main() {
srand(time(NULL)); // 设置随机数种子
sem_init(&count, 0, 4); // 最多有四个哲学家可以进来
pthread_t philosophers[NUM_PHILOSOPHERS];
// 使用循环初始化信号量
for (int i = 0; i < NUM_CHOPSTICK; i++) {
sem_init(&chopstick[i], 0, 1); // 每个筷子初始化为 1(可用)
}
int temp = 1;
// 创建哲学家线程
for (int i = 1; i <= NUM_PHILOSOPHERS; i++) {
int* id = malloc(sizeof(int)); // 动态分配内存
*id = i;
pthread_create(&philosophers[i - 1], NULL, philosopher, id);
}
// 等待哲学家线程结束
for (int i = 0; i < NUM_PHILOSOPHERS; i++) {
pthread_join(philosophers[i], NULL);
}
// 销毁信号量
for (int i = 0; i < NUM_CHOPSTICK; i++) {
sem_destroy(&chopstick[i]);
}
return 0;
}
热门推荐
基于Arduino的宠物食物分配器制作教程
不同测序方法对比
华硕主板BIOS设置教程:从入门到个性化配置
屠晓宇四连胜,全场紧逼朴廷桓致其超时负,主播洗手收奇效
伊朗原子能组织:地震未对纳坦兹核设施造成影响
学校励志名言,为学习添动力
英国短毛猫蓝猫是什么?品种特征、性格与饲养解析
技术干货 | 智能电源管理芯片的“安全密码”——短路特性测试
英语议论文写作指南:从立论到论证的五大核心要点
乌卢鲁十大必玩体验
图片优化:使用适当的图片尺寸、格式和 Alt 标签
蓝铃花的花语:纯洁、坚强与宁静的多重寓意
经常梳头和不怎么梳头,到底哪种更健康?
氮气在新能源行业的应用
如何判断冰箱温控器是否坏了(详解冰箱温控器故障判断方法及维修指南)
揭秘乾隆地宫:为何有三位皇贵妃陪葬?
学会这16个变频器参数设定方法,可以搞定90%变频调试了!
SQL教程:新手如何快速掌握数据库查询语言
UI设计中的色彩魔法:深蓝色搭配指南
2024年中国自主品牌汽车市场占有率逼近70%:全面崛起,主宰未来
宝马5系购置税计算详解:以525Li豪华套装为例
解决医学图像分类中,类别增量学习的不平衡问题
中药甘草的作用及食用方法
细菌性与病毒性腮腺炎的区别
苹果成熟上市时间详解:从早熟到晚熟的全周期指南
天南地北陕西人
新国标插座插排究竟有哪些规定?盘点那些被我们忽略的安全知识
杭州夜市全攻略:从传统吴山到新晋大道,百元就能吃遍拱墅美食
药品不良反应,预防与应对措施
2024年联合国公务员报考指南:中国人申请条件详解