哲学家进餐问题的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;
}
热门推荐
乌兹别克斯坦2025年投资前景
舒尔特方格:真的能训练专注力吗?
留学预科真的是申请国外大学的捷径吗?
全口牙周刮治多少钱一次?龈下刮治能治好牙周炎吗?
深圳牙周治疗费用多少?治疗周期长吗?医保覆盖范围
如何开具土地相关证明?开具过程有哪些注意事项?
火箭主场战独行侠:5人缺阵仍有望取胜,反超湖人重返西部前四
地质灾害防治科普小知识
印象派:西方现代艺术的先驱
什么是电池充放电效率
C语言输入输出数据一致性详解:从基础函数到异常处理
董昭:曹魏杰出谋士的非凡能力与智慧
剧组如何选择演员团队
明清嫔妃制度:等级划分与文化内涵
强如加内特1995年第五顺位被选中,前面的四人是谁?生涯成就如何
项目计划书如何写:从结构到内容的全面指南
《一个叫欧维的男人决定去死》:北欧版《活着》,讲述一个倔老头的体面人生
安保监控视频应该存储多长时间?
为什么正畸治疗让牙齿变黄?避免变色的小贴士
英雄联盟阿卡丽背景故事一览
英雄联盟阿卡丽背景故事一览
深度解析万兆网卡光口与电口的选择
详解遗产继承权:法定继承、遗嘱继承与代位继承
分期付款买卖合同 违约后怎么处理?
网络共享打印机脱机状态怎么办?5个排查步骤轻松解决
轻松掌握共享打印机的连接与设置技巧,提高工作效率和便利性
芯片设计需要哪些基本知识
芯片生产工具软件有哪些
这些信号要牢记!注意防范地质灾害
持续学习:个人成长与职业发展的关键驱动力