1226. The Dining Philosophers (Leetcode 1226)

dining-philosophers:餐饮哲学家问题的另一种解决方案 它使用带有信号量和互斥量的导体解决方案。 您可以确定要吃的哲学家的数量(最小= 3,最大= 999,默认= 5)。它打印当前状态,并在所有哲学家都吃完之后停止工作。 之后显示统计信息。 编译: gcc -pthread -o philutku2 philutku2.c 执行: ./philutku2 number_of_philosophers 示例: ./philutku2 10 输出: Statistics: Philosopher 1 eaten for 2 times Philosopher 2 eaten for 1 times Philosopher 3 eaten for 1 times Philosopher 4 eaten for 2 times Philosopher 5 eaten for 3 times Philosopher 6 eaten for 1 ti 立即下载

1226. The Dining Philosophers (Leetcode 1226)

题目描述

  1. 原文地址 https://leetcode.com/problems/the-dining-philosophers/

  2. 题目含义在下面代码中:


import java.util.concurrent.Semaphore;

/**
 * 哲学家吃饭问题, 5个人围在一个桌子, 每个人左右两边都有一支筷子, 现在wantsToEat 会被5个线程调用, 怎么让他有序的安排5个哲学家吃饭.
 * <p>
 * 思考: 死锁产生的条件是下面四个,破坏其中任何一个, 死锁都不存在
 *    a. 互斥
 *    b. 不可抢占
 *    c. 占有并且等待.
 *    d. 循环等待
 * <p>
 * 1. 怎么破坏互斥? 有足够多的筷子, 那么每个人都用自己的, 在这里不适用. (NO)
 * 2. 怎么破坏不可抢占 ? 这个不好搞, 一个哲学家拿到一支筷子, 别的哲学家不能抢占(从手中抢过来) (NO)
 * 3. 怎么破坏占有并且等待 ?  要么拿不到筷子,要么一次性拿到, 这样不就存在咱有并且等待的问题. (OK)
 * 4. 怎么破坏循环等待 ?
 *    发生循环等待必定是(假如每个人都是先左后右) 每个人拿到了自己的左边, 同时在等待另一边,
 *    a. 如果只让最多4个人吃饭, 那么这个循环等待的问题就不复存在.
 *    b. 如果让0~3 都是先拿左手的筷子 再拿右手的筷子, 而对于4这个人, 先拿右手的筷子, 再拿左手的筷子, 那么这个环路也被破坏了
 *    c. 还有更厉害的人发现 坐标为基数和偶数的人拿筷子的顺序不一样也可以破坏循环等待条件
 */

/*// Solution1 破坏占有并且等待条件 (10ms)
class DiningPhilosophers {
  int n;
  boolean[] availables;
  Object lock;
  public DiningPhilosophers() {
    this(5);
  }
  public DiningPhilosophers(int n) {
    this.n = n;
    // availables 代表的是筷子, 当然了,更好理解的是代表人, 代码需要修改
    this.availables = new boolean[n];
    lock = new Object();
    Arrays.fill(availables, true);
  }

  // call the run() method of any runnable to execute its code
  public void wantsToEat(int philosopher,
                         Runnable pickLeftFork,
                         Runnable pickRightFork,
                         Runnable eat,
                         Runnable putLeftFork,
                         Runnable putRightFork) throws InterruptedException {
    int left = philosopher;
    int right = (philosopher + 1) % n;
    synchronized (lock) {
      while (true) {
        if (!(availables[left] && availables[right])) {
          lock.wait();
          continue;
        }
        availables[left] = availables[right] = false;
        break;
      }
    }
    pickLeftFork.run();
    pickRightFork.run();
    eat.run();
    putLeftFork.run();
    putRightFork.run();
    synchronized (lock) {
      availables[left] = availables[right] = true;
      lock.notifyAll();
    }
  }
}*/

/*// 只允许最多4个人吃饭  20ms
class DiningPhilosophers {
  int n;
  Semaphore eatingPeople;
  Semaphore[] knifes;
  public DiningPhilosophers() {
    this(5);
  }

  public DiningPhilosophers(int n) {
    this.n = n;
    this.eatingPeople = new Semaphore(n - 1);
    knifes = new Semaphore[n];
    for (int i = 0; i < knifes.length; i++) {
      knifes[i] = new Semaphore(1);
    }
  }

  // call the run() method of any runnable to execute its code
  public void wantsToEat(int philosopher,
                         Runnable pickLeftFork,
                         Runnable pickRightFork,
                         Runnable eat,
                         Runnable putLeftFork,
                         Runnable putRightFork) throws InterruptedException {
    eatingPeople.acquire();
    int left = philosopher;
    int right = (philosopher + 1) % n;
    knifes[left].acquire();
    knifes[right].acquire();
    pickLeftFork.run();
    pickRightFork.run();
    eat.run();
    putLeftFork.run();
    putRightFork.run();
    knifes[left].release();
    knifes[right].release();
    eatingPeople.release();
  }
}*/

// 破坏循坏等待,让最后一个人的拿筷子顺序不一样 (10ms)
class DiningPhilosophers {
  int n;
  Semaphore[] semaphores;

  public DiningPhilosophers() {
    this(5);
  }

  public DiningPhilosophers(int n) {
    this.n = n;
    this.semaphores = new Semaphore[n];
    for (int i = 0; i < n; i++) {
      semaphores[i] = new Semaphore(1);
    }
  }

  // call the run() method of any runnable to execute its code
  public void wantsToEat(int philosopher,
                         Runnable pickLeftFork,
                         Runnable pickRightFork,
                         Runnable eat,
                         Runnable putLeftFork,
                         Runnable putRightFork) throws InterruptedException {
    int left = philosopher;
    int right = (philosopher + 1) % n;
    // if the guy is the last one, change its order to pick the chopsticks
    if (left == n - 1) {
      left = 0;
      right = n - 1;
    }
    semaphores[left].acquire();
    semaphores[right].acquire();
    pickLeftFork.run();
    pickRightFork.run();
    eat.run();
    putLeftFork.run();
    putRightFork.run();
    semaphores[left].release();
    semaphores[right].release();
  }
}

LLC谐振变换器恒压恒流双竞争闭环控制simulink仿真(附说明文档) 内容概要:本资源是一套面向电力电子与智能控制领域的综合性科研仿真资料合集,核心聚焦于LLC谐振变换器的恒压恒流双竞争闭环控制策略设计与Simulink建模仿真实现,涵盖半桥LLC、双向全桥LLC等拓扑结构的调频闭环仿真,并提供详尽的说明文档与PPT辅助材料。资源体系不仅深入呈现LLC变换器的动态响应与控制逻辑,还扩展至双有源桥(DAB)变换器的软开关协同优化、最小应力控制、EPS调制策略及新扩展移相角优化等前沿技术,同时集成三相PWM整流器在电网不平衡条件下的功率平衡控制、VOC+SVPWM双闭环控制等典型应用场景。此外,资源包涵盖状态估计(如EKF、UKF、PF)、微电网经济调度、卡尔曼滤波融合、神经网络控制、PID优化、储能系统管理等多个交叉方向,特别强调对顶级EI期刊研究成果的高精度复现,旨在帮助科研人员快速掌握先进控制算法的核心思想与仿真实现方法。; 适合人群:电气工程、自动化、电力电子、新能源科学与工程等相关专业的硕士博士研究生、高校科研人员,以及从事新能源变换器、智能电网、电动汽车、微电网系统研发的工程技术人员。; 使用场景及目标:① 深入理解LLC与DAB变换器的闭环控制机理,掌握恒压恒流切换、软开关实现与损耗优化方法;② 利用Simulink平台构建复杂电力电子系统模型,开展动态性能分析与控制器参数整定;③ 复现高水平期刊论文中的先进控制策略,提升科研创新能力与论文发表竞争力;④ 支持毕业设计、科研课题、项目申报及工程原型开发中的仿真验证环节。; 阅读建议:建议结合提供的完整资源目录循序渐进学习,优先研读标注“顶级EI复现”的案例以获取权威方法参考,配合MATLAB/Simulink动手搭建模型,重点关注控制框图设计、调制逻辑实现与仿真结果对比,深入理解算法背后的物理意义与数学推导过程。 立即下载

相关推荐

车载以太网SOMEIP入门必看:从服务发现到事件订阅,一次搞懂三种核心通信模式(附报文实例)

本文深入解析车载以太网SOME/IP的三种核心通信模式:服务发现、方法调用和事件订阅,通过真实报文实例和仿真工具演示,帮助开发者快速掌握这一关键技术。文章特别强调服务发现机制的基础作用,并详细介绍了Request/Response与Fire&Forget两种方法调用模式的应用场景,为智能汽车网络通信开发提供实用指南。

weixin_30955617的博客 111

【Leetcode】1226. The Dining Philosophers

每个哲学家只有在其两边的哲学家都不在吃饭的时候,他才能吃饭。同时,我们也不希望同一个哲学家有多于一个线程在操控(我们对每个哲学家都开一个mutex)。我们可以开一个condition_variable,当当前哲学家不能吃饭的时候就wait,如果能吃,则标记其正在吃饭,同时将两边的哲学家都锁上,吃完了之后再将两边哲学家解锁。每个哲学家只有在两边的叉子都没正在使用的情况下才能吃饭,并且吃饭的时候会使用左右两边的两个叉子。每个哲学家不是在吃饭就是在思考。要求设计一个并发算法,使得没有哲学家在永远挨饿。

数学、算法爱好者的博客 312

Zabbix安装与部署 系统环境:centos7.0

Zabbix安装与部署 系统环境:centos7.0

weixin_42485027的博客 2600

LeetCode(多线程)- 1226. 哲学家进餐

题目链接:点击打开链接 题目大意:略。 解题思路 位运算难点理解(00000,0未占用,1占用) (expect & mask) > 0:如果有占用到其中一把刀,则一定是大于 0,否则没被占用 fork.compareAndSet(expect, expect ^ mask):异或运算业务理解,只要这把刀上被占用,则标记为 1,否则 0 Ps:解决方案(7) 一直超时,难道是因为 sync 太占用时间了?单次平台上运算的时候 n = 11 都没超时呢! 相关企业 谷歌

580

自动驾驶仿真:基于Carsim开发的加速度请求模型

1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要给控制器仿真加速度的信号,控制器才会实现对纵向功能的控制。2、Carsim或者其他动力学软件,主要提供者节气门开度和主缸压力进行控制。我们在进行联合仿真时,往往都要通过PID的方式将请求加速度转换成对应的节气门开度与主缸压力传给动力学软件进行闭环控制。

zataji的博客 6914

C++实战:基于ONNX Runtime与OpenCV部署XFeat图像匹配模型

本文详细介绍了在C++环境中,利用ONNX Runtime与OpenCV高效部署XFeat图像匹配模型的完整流程。内容涵盖环境搭建、模型转换、核心代码封装及可视化实现,旨在帮助开发者将这一先进的深度学习模型集成到对性能要求苛刻的工业或嵌入式应用中,实现鲁棒且快速的特征匹配。

gpu4optimizer的博客 522

多线程LeetCode 1226. 哲学家进餐 Java代码

题目 https://leetcode-cn.com/problems/the-dining-philosophers/ 限制4人同时用餐并且先拿左手边的筷子 class DiningPhilosophers { Semaphore s1=new Semaphore(4); Semaphore[] c=new Semaphore[5]; public DiningPhilosophers() { for(int i=0;i<5;i++){

乾坤未定,你我皆是黑马 367

UEFI开发探索102 – ACPI探究01(UEFI配置表)

(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) ACPI探究01(UEFI配置表)1 大致规划2 UEFI Configuration Table(配置表)3 代码实现 最近有项工作,是修改ACPI表。问题本身并不复杂,但是由于代码需要移植到Option ROM上,遇到不少奇怪的现象。因此,花了不少时间,对ACPI进行研究。 任务是完成了,我的好奇心又被勾起来了。准备发挥“格物致知”的信念,把我认为的ACPI各方面的知识,好好地捋一捋。 1 大

8244

力扣1226. 哲学家进餐(信号量)

力扣1226. 哲学家进餐(信号量) https://leetcode-cn.com/problems/the-dining-philosophers/ 信号量 假设每个哲学家都先拿左手的叉子,再拿右手的叉子,那么就有可能出现五个哲学家都拿起左手的叉子,且都拿不了右手的叉子的情况。 为了解决这个问题,一种可行的办法是对拿叉子这个过程加互斥信号量,所有哲学家必须先获得拿叉子的“许可证”,然后依次拿起叉子,再释放这个“许可证”。这样就保证了DeadLock Free。 #include &l

小麦China的博客 443

飞腾D2000开发板实战:手把手教你为UEFI/EDK2驱动SD3077 RTC时钟芯片

本文详细介绍了在飞腾D2000开发板上为UEFI/EDK2环境驱动SD3077 RTC时钟芯片的全流程开发指南。从硬件连接到软件适配,包括引脚复用配置、电源管理优化以及UEFI驱动的深度定制,帮助开发者解决嵌入式系统中的时间同步问题,确保RTC芯片的稳定性和准确性。

weixin_30892037的博客 423

PCB过孔全介绍

过孔(via)是多层PCB的重要组成部分之一,钻孔的费用通常占PCB制板费用的30%到40%。简单的说来,PCB上的每一个孔都可以称之为过孔。从作用上看,过孔可以分成两类:一是用作各层间的电气连接;二是用作器件的固定或定位。如果从工艺制程上来说,这些过孔一般又分为三类,即盲孔(blind via)、埋孔(buried via)和通孔(through via)。盲孔位于印刷线路板的顶层和底层表面,具

小王的自我修行路 2355

LeetCode 1226. 哲学家进餐(C++多线程)

思路: 参考题解:https://leetcode-cn.com/problems/the-dining-philosophers/solution/zhe-xue-jia-jiu-can-wen-ti-by-mike-meng/ 解法1:控制同时拿筷子的哲学家人数(不多于4个) class Semaphore { public: Semaphore(int count = 0): count_(count){} void Set(int count) { count_ =.

tomjobs的博客 1329

基于DNN、CNN与SVM的串联电弧故障智能检测:从原理到嵌入式部署

在电气安全与工业物联网领域,时间序列分类是处理传感器信号、实现状态监测与故障诊断的核心技术。其原理在于从连续的信号数据中提取有效特征,并利用机器学习模型识别异常模式。这项技术的核心价值在于能够实现设备预测性维护、提升系统安全性并降低运维成本,广泛应用于智能电表、电机健康监测、电力设备保护等场景。本文聚焦于电气安全中的一个具体且危险的隐患——串联电弧故障的检测。针对这一隐蔽性强、传统方法误报率高的问题,项目深入实践了三种主流AI模型:深度神经网络、卷积神经网络和支持向量机。通过对比DNN的通用特征学习能力、C

weixin_31860973的博客 413

leetcode 1226. The Dining Philosophers 多人进餐问题

Problem:多线程,计算机操作系统教科书里面的案例的,主要是防止死锁问题,提出的方案,这里考虑到共5个餐具,所以配置了5个互斥量,5个条件变量,5个变量首先用unique_lock初始化锁方便自动加锁和解锁,判断编号然后使用相应的互斥量和条件变量,修改变量的每次通知一个人,用00, 11, 22, 33, 44代表5个人,0, 1, 2, 3, 4代表5个餐具,那么就是: 4 00 0 11 1 22 2 33 3 44 4,所以人和餐具的排列就是这样子的。

邹九的个人博客 117

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

LeetCode(1226):哲学家进餐 The Dining Philosophers(JUC)

2020.12.19 LeetCode 从零单刷个人笔记整理(持续更新) github:https://github.com/ChopinXBP/LeetCode-Babel 传送门:哲学家进餐 Five silent philosophers sit at a round table with bowls of spaghetti. Forks are placed between each pair of adjacent philosophers. Each philosopher must alt

NJU_ChopinXBP的博客 758

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

1226. 哲学家进餐

目录1、防止同时拿起一边的叉子,奇数左手先,偶数先右手先2、设置最多进餐人数为3。 5 个沉默寡言的哲学家围坐在圆桌前,每人面前一盘意面。叉子放在哲学家之间的桌面上。(5 个哲学家,5 根叉子) 所有的哲学家都只会在思考和进餐两种行为间交替。哲学家只有同时拿到左边和右边的叉子才能吃到面,而同一根叉子在同一时间只能被一个哲学家使用。每个哲学家吃完面后都需要把叉子放回桌面以供其他哲学家吃面。只要条件允...

Flag_died的博客 394

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

经典死锁问题 - 哲学家圆桌就餐

https://leetcode-cn.com/problems/the-dining-philosophers/ 5 个沉默寡言的哲学家围坐在圆桌前,每人面前一盘意面。叉子放在哲学家之间的桌面上。(5 个哲学家,5 根叉子) 所有的哲学家都只会在思考和进餐两种行为间交替。哲学家只有同时拿到左边和右边的叉子才能吃到面,而同一根叉子在同一时间只能被一个哲学家使用。每个哲学家吃完面后都需要把叉子放回桌面以供其他哲学家吃面。只要条件允许,哲学家可以拿起左边或者右边的叉子,但在没有同时拿到左右叉子时不...

Peace 1001

Leetcode 1226:哲学家进餐

题目描述 5 个沉默寡言的哲学家围坐在圆桌前,每人面前一盘意面。叉子放在哲学家之间的桌面上。(5 个哲学家,5 根叉子) 所有的哲学家都只会在思考和进餐两种行为间交替。哲学家只有同时拿到左边和右边的叉子才能吃到面,而同一根叉子在同一时间只能被一个哲学家使用。每个哲学家吃完面后都需要把叉子放回桌面以供其他哲学家吃面。只要条件允许,哲学家可以拿起左边或者右边的叉子,但在没有同时拿到左右叉子时不能进...

weixin_35338624的博客 530

哲学家用餐问题(Dining philosophers)【代码实现】

C #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <stdarg.h> #define N 5 const char *names[N] = { "Aristotle", "Kant", "Spinoza...

数据联盟 7437

Dining philosophers problem

  经常使用的方法:  Locking a resource is a common technique to ensure the resource is accessed by only one program or chunk of code  at a time. 算法: Waiter solution 引入一个服务员 Philosophers mu

O(1) 的小乐 2385

Combine Two Tables

Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | +-------------+---------+ Per

记录技术,记录生活 857

Linux 多线程同步之哲学家用餐问题分析

有五个哲学家公用一张餐桌,分别坐在周围的五张椅子上,在餐桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和用餐。平时,一个哲学家进行思考,饥饿时便试图拿取其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐,进餐完毕,放下筷子继续思考。 思路: 选用互斥锁mutex,如创建5个, pthread_mutex_t m[5]; 模型抽象: 5个哲学家 --> 5个线程; 5支筷子 -

hj605635529的博客 2921

Leetcode_1226_哲学家进餐_多线程

写法和标程一样 很经典的信号量应用。 用信号量可以限制进入的人数,从而规避死锁。 信号量初始值的选用对性能的影响是这道题的精华所在。 import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.Semaphore; class DiningPhilosophers { private final ReentrantLock[] ForkList = {new ReentrantLock(),new Re

HDUCheater的博客 288

进程同步与互斥——哲学家就餐问题源码实现(dining philosopher’s problem)

哲学家就餐问题 哲学家就餐问题(dining philosopher’s problem)是一个著名的并发问题,它由Dijkstra提出来并解决。这个问题之所以出名,是因为它很有趣,引人入胜,但其实用性却不强。可是,它的名气让我们在这里必须讲。实际上,你可能会在面试中遇到这一问题,假如老师没有提过,导致你们没有通过面试,你们会责怪操作系统老师的。因此,我们这里会讨论这一问题。假如你们因为这个问题得到工作,可以向操作系统老师发感谢信,或者发一些股票期权。 这个问题的基本情况是:假定有5位“哲学家”围着一个

CLZHIT的博客 3328

[bzoj1226]学校食堂Dining

[bzoj1226]学校食堂Dining 状压dp,注意记上一个人的时候要记到负数(当前这个人之前) 代码 #include&lt;bits/stdc++.h&gt; using namespace std; const int INF=0x3f3f3f3f; int t[1010],b[1010]; int G[1010][500][16]; int n; int calc(int a...

jerome_wei的博客 249

蒙蒂霍尔问题_常见的逻辑难题–骑士和刀,蒙蒂·霍尔和就餐哲学家的问题解释...

蒙蒂霍尔问题While not strictly related to programming, logic puzzles are a good warm up to your next coding session. You may encounter a logic puzzle in your next technical interview as a way to judge your ...

cumi7754的博客 2600
上一篇: Leetcode 11. Container With Most Water (two pointers)
左眼皮跳跳~
博客等级 码龄13年 17粉丝 400原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值