哲学家进餐问题的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;
}
热门推荐
西安十大名面,你最爱哪一碗?
西安面食大比拼:Biangbiang面vs油泼面,谁才是真正的王者?
政府统筹、多方联动:科学教育校家社协同机制创新
如何提升自己的信念呢?
研究发现:早年苦难会影响人体多个系统,扰乱终身健康
优化ExFat文件系统,轻松调整分配单元大小及分区大小指南
MBR分区与GPT分区的区别
《亚刻奥特曼》大结局:一场引发热议的开放式冒险
探寻优质红茶的独特风味与口感特征
“生物+”技术助力农作物产量品质双提升
【绿色出行】绿色出行宣传月丨绿色出行,从我做起,从小事做起
筒灯选购指南:从光源到散热,打造完美居家照明
嘉靖年间宫女刺杀案:一场因暴政引发的反抗
1542年乾清宫遇刺案:嘉靖帝险遭宫女行刺
嘉靖帝遇刺:宫女反抗暴政惊动朝野
西安开店创业指南:从选址到经营的实用攻略
肠躁症全攻略:症状、成因、治疗与饮食建议
蔓越莓雪花酥最佳食材指南:从选材到制作的全方位解析
自制雪花酥:从零到美食的甜蜜之旅
解码汉字:独特形态与深厚文化内涵
红糖姜茶:经期暖心饮品的科学解读
经期必备饮品:红糖姜茶&玫瑰花茶的功效与制作方法
无黄油雪花酥:健康零食新选择
低空经济崛起,无人机操控员成就业新蓝海
菩提塔东社区亲子雪花酥DIY:一场暖心的社区共建活动
雪花酥爆红:五大主材如何成就网红甜点
肺结节高发无需慌,化妆品粉尘影响小
中医专家:肺结节患者需做好这7件事
董宇辉带货文学杂志爆火,传统文学如何拥抱互联网?
蔡司眼镜片好还是依视路好,各自拥有独特的技术优势和广泛的市场认可!