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

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

互斥条件:资源不可共享

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

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

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

一、核心思路

  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 人同时尝试拿筷子

这样:

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

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

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

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

理解口诀

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

相关推荐
Ro Jace1 小时前
计算机专业基础教材
java·开发语言
mango_mangojuice1 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
程序员侠客行1 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
时艰.1 小时前
Java 并发编程 — 并发容器 + CPU 缓存 + Disruptor
java·开发语言·缓存
丶小鱼丶1 小时前
并发编程之【优雅地结束线程的执行】
java
市场部需要一个软件开发岗位1 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
忆~遂愿1 小时前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
MZ_ZXD0011 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东2 小时前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology2 小时前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络