【操作系统】哲学家就餐问题实现详解

回顾一下死锁成立需要 四个条件同时满足:

互斥条件:资源不可共享

占有且等待:进程已经持有至少一个资源,同时请求新的资源

不可剥夺:已分配资源不能被抢走

循环等待:存在一个环,每个进程都在等待下一个持有的资源

一、核心思路

  1. 每根筷子对应一个互斥信号量 chopstick[i]

  2. 限制同时就餐人数 ≤ N-1(破坏占有且等待条件,避免死锁)

  3. 每个哲学家:

    • 先思考
    • 尝试拿左右筷子
    • 吃完释放筷子

二、C 语言伪代码实现

c 复制代码
#include <semaphore.h>
#include <pthread.h>

#define N 5  // 哲学家数量

sem_t chopstick[N];   // 每根筷子
sem_t room;           // 限制同时就餐人数

void* philosopher(void* num) {
    int i = *(int*)num;
    while (1) {
        // 思考
        think(i);

        // 进入餐厅,限制最多 N-1 哲学家同时尝试拿筷子
        sem_wait(&room);

        // 拿筷子
        sem_wait(&chopstick[i]);            // 左筷子
        sem_wait(&chopstick[(i+1)%N]);      // 右筷子

        // 吃饭
        eat(i);

        // 放筷子
        sem_post(&chopstick[i]);
        sem_post(&chopstick[(i+1)%N]);

        // 离开餐厅
        sem_post(&room);
    }
}

为什么破坏了"占有且等待"

N 个哲学家最多 N-1 人同时尝试拿筷子

这样:

至少有一个哲学家能拿到 两根筷子并吃饭

吃完释放 → 其他哲学家可以继续拿

关键:哲学家不会永远占着一根筷子等待另一根

→ 占有且等待条件被破坏 → 系统无法形成死锁

理解口诀

"限制人数,拿筷子互斥 → 吃完放回 → 死锁破"

相关推荐
JAVA面经实录9175 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
许彰午6 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
Bat U7 小时前
JavaEE|多线程初阶(七)
java·开发语言
掌心向暖RPA自动化10 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
日取其半万世不竭10 小时前
Minecraft Java版社区服务器搭建教程(Linux,适合新手)
java·linux·服务器
TeamDev11 小时前
JxBrowser 9.0.0 版本发布啦!
java·前端·混合应用·jxbrowser·浏览器控件·跨平台渲染·原声输入
AI人工智能+电脑小能手11 小时前
【大白话说Java面试题】【Java基础篇】第24题:Java面向对象有哪些特征
java·开发语言·后端·面试
AI人工智能+电脑小能手12 小时前
【大白话说Java面试题】【Java基础篇】第25题:JDK1.8的新特性有哪些
java·开发语言·后端·面试
likerhood12 小时前
SLF4J: Failed to load class “StaticLoggerBinder“ 解决
java·log4j·maven
早日退休!!!12 小时前
大模型推理瓶颈七层分析模型
java·服务器·数据库