当前位置: 首页 > ai >正文

哲学家就餐问题(避免死锁)

解决方案
  • 策略:奇偶哲学家拿筷子顺序不同,破坏循环等待。

  • 流程

    1. 偶数哲学家先左后右。

    2. 奇数哲学家先右后左。

分析

  • 无死锁,哲学家交替进餐,不同拿筷顺序避免循环等待。


实验总结

遇到的问题及解决

  1. 读者写者写者优先难以实现:通过引入 readTry 信号量,确保写者优先阻塞新读者。

  2. 哲学家死锁:调整奇偶拿筷顺序,破坏循环等待条件。

心得体会

  • 并发编程需精确控制同步机制,避免竞态和死锁。

  • 测试需覆盖多线程竞争场景,调试时输出线程状态有助于定位问题。

测试数据

  • 5个哲学家线程,每个循环5次。

运行结果

Philosopher 0 is thinking...

Philosopher 1 is thinking...

Philosopher 0 is eating...

Philosopher 2 is eating...

源代码

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>#define NUM_PHILOSOPHERS 5
#define NUM_LOOP 5sem_t chopsticks[NUM_PHILOSOPHERS];void *philosopher(void *arg) {int id = *(int*)arg;int left = id, right = (id+1) % NUM_PHILOSOPHERS;for (int i = 0; i < NUM_LOOP; i++) {printf("Philosopher %d thinking...\n", id);usleep(1000000);if (id % 2 == 0) {sem_wait(&chopsticks[left]);sem_wait(&chopsticks[right]);} else {sem_wait(&chopsticks[right]);sem_wait(&chopsticks[left]);}printf("Philosopher %d eating...\n", id);usleep(500000);sem_post(&chopsticks[left]);sem_post(&chopsticks[right]);}return NULL;
}int main() {pthread_t phils[NUM_PHILOSOPHERS];int ids[NUM_PHILOSOPHERS];for (int i = 0; i < NUM_PHILOSOPHERS; i++)sem_init(&chopsticks[i], 0, 1);for (int i = 0; i < NUM_PHILOSOPHERS; i++) {ids[i] = i;pthread_create(&phils[i], NULL, philosopher, &ids[i]);}for (int i = 0; i < NUM_PHILOSOPHERS; i++)pthread_join(phils[i], NULL);for (int i = 0; i < NUM_PHILOSOPHERS; i++)sem_destroy(&chopsticks[i]);return 0;
}

 

http://www.xdnf.cn/news/503.html

相关文章:

  • BootStrap:进阶使用(其二)
  • 计算机网络 实验五 RIP的配置与应用
  • 序列化和反序列化
  • 第9期:文本条件生成(CLIP + Diffusion)详解
  • 基于 Python 的自然语言处理系列(82):Transformer Reinforcement Learning
  • Alan AI - 面向Web的生成式AI SDK
  • 基于C语言实现文件读取
  • Linux 第五讲 --- 权限管理
  • 6.常用控件-QWidget|windowTitle|windowIcon|qrc机制|windowOpacity|cursor(C++)
  • Amlogic S905L3 系列对比:L3A、L3B 与 L3AB 深度解析
  • Unity之如何实现RenderStreaming视频推流
  • 大学英语四级选词填空阅读题和段落匹配解析
  • 【Hot100】54. 螺旋矩阵
  • 2025.04.19-阿里淘天春招算法岗笔试-第一题
  • 金融数学专题6 证券问题与资本利得税
  • Pandas数据统计分析
  • MCS-51单片机汇编语言编程指南
  • ArcPy Mapping 模块基础
  • 3. 进程概念
  • 修改Theme SHELL美化panel
  • Docker 网络详解:从 docker0 网桥到网络命名空间
  • 复习JUC的总结笔记
  • 整流二极管详解:原理、作用、应用与选型要点
  • 什么是零缺陷质量管理?
  • DNS主从同步实验
  • LeetCode 解题思路 42(Hot 100)
  • DDPM(diffusion)原理
  • 健康养生:拥抱美好生活的基石
  • LangChain框架-检索器详解
  • Map和Set相关练习