【操作系统】哲学界进餐问题实现

news2024/11/24 3:30:27

目录

实验原理:

实验目的:

实验数据及结果分析:


  • 实验原理:

哲学家进餐问题可以通过限制同时进餐人数为4解决,为此需要设置一个值为4的互斥信号量sem_eaters,并且每根筷子只能同时由一个人使用,需要设置一个值为1的互斥信号量数组sem_chopstics。C语言中提供了实现信号量和线程创建等方法的库,可以使用C语言在ubuntu操作系统上实现哲学家进餐问题的解决。

  • 实验目的:

  1. 掌握哲学家就餐问题,掌握预防死锁的实现方法;
  2. 了解Linux系统下进程和线程的实现;
  3. 掌握通过互斥量、POSIX信号量、XSI信号量集实现多线程/多进程同步控制的方法
  • 实验内容:

熟悉Ubuntu系统环境和命令;熟悉Ubuntu系统下的多线程/多进程编程;在Ubuntu系统下编程实现哲学家就餐问题。实现教材2.5.2节中所描述的哲学家就餐问题。要求显示出每个哲学家的工作状态,如吃饭,思考。连续运行30次以上都未出现死锁现象。

  • 实验器材(设备、元器件):

PC计算机,操作系统:Ubuntu

  • 实验步骤:
  1. 了解C语言实现线程互斥中的信号量、线程等使用方式

本实验主要用到了POSIX信号量,来自semaphore.h和来自pthread.h的线程创建等方法。

如sem_init()初始化信号量,sem_post()对信号量进行V操作,phtread_create()创建线程等函数,实现哲学家进餐问题。

  1. 考虑哲学家进餐问题的实现

本次实验中采用约束同时进餐人数的方式避免死锁发生,当同时进餐人数最多为4人的时候,不会发生死锁(还有同时请求两根筷子等解决方案,这里只说明其中一种)。可以通过一个初始值为4的信号量sem_eaters控制,以达到目的。

  1. 编写代码

图1

  1. 使用gcc编译.c文件

图2

  1. 执行编译后的文件

图3

  1. 运行结果

图4

  • 实验数据及结果分析:

实验数据

类型

初始化

sem_eaters信号量

sem_t

sem_init 值为4

sem_chopstics信号量数组

sem_t

sem_init 值为1

PID数组

Int

{0,1,2,3,4}

pthreads数组

pthread_t

使用pthread_create初始化

循环次数

Int

70

通过70次循环哲学家问题,没有发现报错,即没有出现死锁,均正常执行。

实验代码如下:

  1.  #include <stdio.h>
  2.  #include <stdlib.h>
  3.  #include <pthread.h> 
  4.  #include <semaphore.h>
  5.  sem_t sem_eaters;//记录哲学家信号量
  6.  sem_t sem_chopstics[5];//记录筷子信号量
  7.  int PID[5] = {0,1,2,3,4};//记录进程ID
  8.  int num = 0;//记录当前已进餐人数
  9.  //初始化
  10.  void init(){
  11.   int i =  0, j ,k;
  12.   for (;i  < 5;i++)
  13.   {
  14.    j = sem_init(&sem_chopstics[i],0,1);//初始化每一根筷子为值为1的信号量
  15.    if (j == -1) {
  16.     perror("初始化sem_chopstics信号量失败\n");
  17.     exit(1);
  18.    }
  19.   }
  20.   k = sem_init(&sem_eaters,0,4);//初始化哲学家信号量,即控制同时进餐的人数
  21.   if (k == -1)
  22.   {
  23.    perror("初始化sem_eaters信号量失败\n");
  24.    exit(1);
  25.   }
  26.  }
  27.  void * method(int* pid){
  28.   int p_num = (*pid) % 5;//当前进餐的哲学家编号
  29.   pirntf("当前第%d号哲学家思考中\n",&p_num);
  30.   sem_wait(&sem_eaters);
  31.   printf("拿起第%d根筷子\n",&p_num);
  32.   sem_wait(&sem_chopstics[p_num]);
  33.   printf("拿起第%d根筷子\n",&((p_num+1) % 5));
  34.   sem_wait(&sem_chopstics[(p_num+1)%5]);
  35.   pirntf("当前第%d号哲学家正在进餐~~\n",&p_num);
  36.   num++;//吃完了
  37.   pirntf("当前第%d号哲学家已经吃完了\n",&p_num);
  38.   //释放资源
  39.   sem_post(&sem_chopstics[(p_num)%5]);
  40.   sem_post(&sem_chopstics[(p_num+1)%5]);
  41.   sem_post(&sem_eaters);
  42.  }
  43.  int main()
  44.  {
  45.   for (int i = 1;i <= 50 ;i++ )
  46.   {
  47.    pthread_t pthreads[5];
  48.    printf("这是第%d次哲学家进餐问题\n",&i);
  49.    init();//初始化信号量
  50.    for (int j = 0;j < 5 ;j++ )
  51.    {
  52.     printf("创建第%d号线程\n",j);
  53.     int k = 0;
  54.     k = pthread_create(&pthreads[j],NULL,method,&PID[j]);//传入进程执行的方法method 要求是void *类型,并且传入函数需要的参数
  55.     if  (k == -1) {
  56.      perror("线程创建失败\n");
  57.      exit(1);
  58.     }
  59.    }
  60.    for (int l = 0; l < 5;l++ )
  61.    {
  62.     pthread.join(pthreads[l],NULL);
  63.    }
  64.    //结束:销毁所有信号量
  65.    sem_destroy(&sem_eaters);
  66.    for (int p = 0;p < 5;p++) {
  67.     sem_destroy(&sem_chopstics[p]);
  68.    }
  69.    num = 0;
  70.   }
  71.   return 0;
  72.  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/668711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka的初步认识

什么是Kafka&#xff1f; Kafka的增长很快。财富500强企业中超过三分之一使用卡夫卡。这些公司包括十大旅游公司&#xff0c;十大银行中的七家&#xff0c;十大保险公司中的八家&#xff0c;十大电信公司中的九家&#xff0c;等等。LinkedIn&#xff0c;微软&#xff08;Micro…

【CV 向】如何打造一个“数串串神器“

导言 最近&#xff0c;我看到了这样一个视频&#xff0c;觉得很有意思&#xff0c;就随手保存下来了。&#x1f601;&#x1f601;&#x1f601; 之前吃串串火锅&#xff0c;老板数竹签不是称重就是用手慢慢数&#xff0c;但是称重似乎总是得不到正确的竹签数目&#xff0c;而…

C++技能系列 ( 7 ) - 右值引用、移动语意、完美转发

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 右值引用、移动语意、完美转发 1、右值引用2、完美转发 1、右值引用 右值引用&#xff08;rvalue refe…

Redux的纯函数、中间件

当我们的应用随着业务的发展&#xff0c;变得越来越复杂的时候&#xff0c;组件之间的状态也是越来越复杂。 reducer函数 之前说过redux中的action&#xff0c;是用来描述一种变化。但是完成变化并且生辰新的数据数据状态的是reducer方法。 reducer方法&#xff0c;必须是纯…

SQL注入攻击与防护

目录 一、SQL注入攻击概述 1.1 SQL注入概念 1.1.1 标准查询过程 1.1.2 SQL注入定义 1.2 SQL注入根本原因 1.3 SQL注入条件 1.4 SQL注入防范 1.4.1 根本原因&#xff1a;过滤不严 1.4.2 安全设计原则&#xff1a;数据与代码分离 1.5 SQL注入流程 1.6 SQL注入分类 1.…

vue3+vite+ts项目配置开发环境和生产环境 打包命令配置

开发环境和生产环境的配置和打包方式有所不同&#xff0c;下面是基于vue3vitets项目的开发环境和生产环境配置及打包方式的详细说明。 开发环境配置 开发环境的配置主要是为了方便开发者进行调试和测试&#xff0c;以下是开发环境的配置步骤&#xff1a; 1.1 安装依赖 首先…

DAY27:回溯算法(二)组合问题及其优化

文章目录 77.组合&#xff08;一定要注意逻辑问题&#xff09;思路for循环嵌套的情况回溯算法模拟for循环K层嵌套 回溯法步骤伪代码完整版debug测试逻辑问题&#xff1a;没有输出逻辑问题&#xff1a;为什么是递归传入i1而不是startIndex1&#xff1f;重要&#xff1a;为什么会…

Java-API简析_java.lang.CharSequence接口(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131318474 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

Unreal 5 实现场景

如果你拿到了一个新的场景&#xff0c;想将此场景应用到游戏当中&#xff0c;首先需要给敌人增加ai移动路径&#xff0c;需要添加导航体积 添加导航模型包围体积 添加了体积以后&#xff0c;设置包围盒的大小&#xff0c;将敌人可以行进的区域给区分出来&#xff0c;然后按键盘…

PyCharm2023开发工具activice教程(包含工具link)

PyCharm2023 前言1. 下载工具2. 选择安装方法33. 填入active code4. 效果如下 前言 PyCharm是一款由JetBrains开发的强大的Python集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;旨在提高Python开发者的生产力和效率。 以下是PyCharm的一些主…

Linux操作系统体系结构 ( 3 ) -【Linux通信架构系列 】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the…

FTP服务器

文章目录 FTP服务器FTP的数据传输原理FTP的功能简介不同等级的用户身份命令记录与日志文件记录限制用户活动的目录 FTP的工作流程与使用到的端口FTP主动式连接FTP被动式连接 vsftpd服务器基础设置为什么使用vsftpd所需要的软件以及软件结构vsftpd.conf 配置值说明与服务器环境比…

【入门向】CV 小白如何入门?人脸识别教程带你学习计算机视觉

导言 计算机视觉作为人工智能领域的一个重要分支&#xff0c;旨在让计算机能够理解和解释图像和视频数据。而OpenCV作为一款开源的计算机视觉库&#xff0c;为开发者提供了丰富的工具和函数&#xff0c;用于处理图像、视频、对象检测、特征提取等任务。对于初学者来说&#xf…

chatgpt赋能python:如何在Python中捕获kill信号

如何在Python中捕获kill信号 在编写Python代码时&#xff0c;我们可能需要处理一些长时间运行的进程。有时候&#xff0c;我们会在运行这些进程时使用kill命令杀死它们。然而&#xff0c;Python进程是否可以捕获kill信号呢&#xff1f;答案是肯定的。 在本文中&#xff0c;我…

基于pyqt5、mysql、yolov7、chatgpt的小麦病害检测系统v1.0

基于pyqt5、mysql、yolov7、chatgpt的小麦病害检测系统设计与实现 一、界面设计1.1安装pyqt51.2创建用户子窗体1.3创建管理员主窗体1.4创建管理员子窗体1.5创建系统登陆界面 二、环境搭建2.1pyqt5工具配置2.2mysql5.7安装 三、编程实现3.1初始化数据库3.2创建用户数据库sdk文件…

chatgpt赋能python:Python如何快速提取指定行和列的数据?

Python如何快速提取指定行和列的数据&#xff1f; 在进行数据分析和处理时&#xff0c;常常需要从海量数据中筛选出所需的数据。这时&#xff0c;Python是一款非常强大的工具&#xff0c;可以方便地进行大规模数据清洗和筛选。本文将介绍如何使用Python快速提取指定行和列的数…

【JVM篇】手撸上万字带你吃透“垃圾回收”

前言&#xff1a;大家好&#xff0c;我是TwosJel&#xff0c;一名21级的本科生(*^▽^*)&#xff0c;最近二刷了《深入理解Java虚拟机》&#xff0c;因此想写一篇关于垃圾回收的随笔&#xff0c;于是便有了这篇文章❥(^_-)。 个人主页&#xff1a;TwosJel 个人介绍&#xff1a…

JWT --- 入门学习

1.常见的认证机制 basic auth &#xff1a; 每次请求都会携带用户的username&#xff0c;password&#xff0c;易被黑客拦截。 Cookie auth : 我们请求服务器&#xff0c;创建一个session对象,客户端创建cookie对象。客户端每次访问&#xff0c;携带cookie对象。 (在当今&…

chatgpt赋能python:Python排队:提高效率、优化流程的神器

Python排队&#xff1a;提高效率、优化流程的神器 随着科技的不断进步&#xff0c;排队已经成为了现代生活中不可避免的一部分。在各个行业中&#xff0c;排队都是必须考虑的问题&#xff0c;包括餐馆、医院、机场和银行等等。针对排队问题&#xff0c;我们可以使用Python编程…

使用Vue + FormData + axios实现图片上传功能实战

前言 上节回顾 上一小节中&#xff0c;我们添加了Vue-router的路有数据&#xff0c;这些数据都将是后续实战课程中的真实路由数据了。同时引入了ElementUI的el-menu做为左侧菜单的组件&#xff0c;但本专栏的特点就是遇到第三方功能和组件&#xff0c;自己尽量也要实现一遍&a…