写点什么

一个有限状态机的 C++ 实现

  • 2019-11-20
  • 本文字数:1264 字

    阅读完需:约 4 分钟

一个有限状态机的C++实现

有限状态机:表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。它对数字系统的设计具有十分重要的作用。常见的计算机就是使用有限状态机作为计算模型的;电脑游戏设计中也经常使用有限状态机模型。本文就讲讲一个状态机的 C++实现。

有限状态机

什么是有限状态机?

简单说就是作一件事可能会经过多个不同状态的转换, 转换依赖于在不同时间发生的不同事件来触发, 举个例子,比如 TCP 的状态转换图, 在实现上就可以用 FSM.


传统的实现方案

if…else : 搞一大堆 if else, 一个函数写很长很长…


swich…case : 也搞一大堆一个函数写很长很长…

FSM 的实现方案

根据具体的业务需要, 将业务的处理流程定义为一个状态机, 此状态机中存在以下必要元素


1.根据业务需要, 拆解抽象出若干个不同状态 State, 并确定此状态机的初始状态;


2 根据实现需要, 抽象出用于触发状态转换的事件 Event;


3.为了处理一个 Event, 需要定义状态的转换过程 Transition;


4.状态机要先判断当前所处的状态是否与当前发生的 Event 匹配(注意: 相同的状态可能同时匹配多个 Event)。


用张简图来说明一下



1.MachineSet 可以同时管理多个 Machine;


2.外部触发的 Event 进入到 MachineSet 的事件队列;


3.事件队列里的 Event 被顺序处理, 被 Dispatch 到 match 的 Machine;


4.Machine 根据当前的所处的 state 和 Event 类型来判断当前 Event 是否有效;


5.如果上面(4)中的 Event 有效, 则进行状态转换;


6.状态转换具体来说涉及到三个回调函数:


6.1 当前 state 离开, 是第一个回调,需要使用者根据实际需要处理;


6.2 trasition 这个转换过程, 是第二个回调;


6.3 新 state 的进入, 是第三个回调;


一个简单的状态机,差不多就是上面这些内容, 剩下的就是用程序语言把它实现出来了;

FSM 的 C++ 实现

一个用 C++11 实现的 FSM 的代码


https://github.com/DavidLiuXh/kuafu
复制代码


实现简介:


主要就是按 deamo 里的思路, 封装了以下几个模块


MachineSet,


Machine,


Event,


Transition,


Predicate


对于 Event 的处理, 提供两种方案:


1.直接使用 MachineSet 提供的 StartBackground, 开启一个 work thread, 在这个 work thread 中不断从存储 event 的 fifo 队列中获取 event 后 dispatch 到各个 machine;


2.不使用 MachineSet 提供的 event fifo, 实现自己的 MachineSetHandler, 将其实例注册到 MachineSet, 从 event 的派发;

一个具体的实现

我们来使用上面的 FSM 的实现来模拟一个用户登陆的场景;


定义用到的 Event 和几种不同的事件类型



定义用到的状态机, 从 kuafu::StateMachine 继承, 其中包括用过的几种 state 和 transition



在 Birth()函数中构造 state 和 transition, Birth()是 StateMachine 的一个虚函数, 每个用户实现的 Machine 都需要实现它:



创建 MachineSet, 并开始 event 处理线程



创建用户定义的 Machine, 设置初始状态



设置 state 和 transition 相应的回调



模拟 event 发生:



相关源码:



本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/BVaOWSzUsGldbmQk9QZgFw


2019-11-20 15:174096

评论

发布
暂无评论
  • Verilog HDL 基本语法规则

    ⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。

    2023-01-28

  • 【云主机】2022 年云主机管理软件排行榜

    目前市面上云主机品牌比较多,很多人不知道具体有哪些云主机厂商,排名是咋样的。今天我们小编就给大家简单汇总一下,来一个排行榜,让更多人知道有哪些知名云主机。

    2022-06-06

  • 22. 行为型 - 状态模式 State

    2023-02-15

  • DDD 建模案例分享

    前面的文章《我理解的 Smart Domain 与 DDD》分析了 Smart Domain 的设计。虽然 Smart Domain 作为一种设计范式,可以辅助实现 DDD。但是具体到项目,建模还得结合实际领域问题,深入思考,大量尝试,大声建模,才能得到好的模型。有哪些值得参考的案例呢?

    2022-10-09

  • 状态机设计中的关键技术

    在使用Verilog HDL描述状态机时,通常用参数定义语句parameter指定状态编码。状态编码方案一般有三种:自然二进制编码、格雷(Gray)编码和独热码(one-hot编码)。对应于图所示的状态图的各种编码方案如表所示。 有限状态机的编码方案

    2023-02-11

  • Verilog HDL 仿真常用命令

    ⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。🔥文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。

    2023-01-27

  • 10. 绩效管理有哪五个最常见问题?(上)

    2023-10-17

  • 金融行业商业分析案例:金融第三方支付案例分析

    2022-12-30

  • Netty 常量池

    在传统的BIO的编程中, 我们创建了一个ServerSocket后, 可以进行一些配置, 如下:ServerSocket serverSocket = new ServerSocket( 8080 );serverSocket.setReceiveBufferSize( 1024 * 64 );serverSocket.setSoTimeout( 3000 );

    2021-11-11

  • 2022 第十五届南京国际工业自动化及工业机器人展览会

    2022长三角国际工业自动化展会,2022第十五届南京国际工业自动化及工业机器人展览会

    2022-07-20

  • 前端 leetcde 算法面试套路之回溯

    回溯,就是无脑冲,碰壁之后就回撤一步继续搞,属于一种暴力解题的思路;

    2023-01-09

  • 资料下载

    2023-09-27

  • 15. 从例外管理到例行管理

    2023-10-17

  • 状态机的概念与设计

    一般情况下,状态触发器的数量是有限的,其状态数也是有限的,故称为有限状态机(Finite State Machine,简称为FSM)。状态机中所有触发器的时钟输入端被连接到一个公共时钟脉冲源上,其状态的转换是在同一时钟源的同一脉冲边沿同步进行的,所以它也被称作时

    2023-02-09

  • MVCC 的机制初识

    死锁通常是对于资源占用之后,没有及时的释放,导致了资源一直被锁定的状态。

    2021-11-16

  • 如何做一场私域裂变活动(上)

    2022-11-21

  • 状态机设计中的关键技术

    在使用Verilog HDL描述状态机时,通常用参数定义语句parameter指定状态编码。状态编码方案一般有三种:自然二进制编码、格雷(Gray)编码和独热码(one-hot编码)。对应于图所示的状态图的各种编码方案如表所示。 有限状态机的编码方案

    2023-02-11

  • 状态机设计中的关键技术

    ⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。🔥文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。

    2023-02-11

  • 【高并发】ScheduledThreadPoolExecutor 与 Timer 的区别和简单示例

    本文,就简单介绍下ScheduledThreadPoolExecutor类与Timer类的区别,ScheduledThreadPoolExecutor类相比于Timer类来说,究竟有哪些优势,以及二者分别实现任务调度的简单示例。

    2021-11-19

发现更多内容

Java从建表语句中提取索引信息, 索引名称,复合索引包含字段,索引类别(普通索引/主键索引/唯一索引/全文索引/空间索引)解决方案

张音乐

数据库 索引 9月日更

渗透测试入门指南之小白该如何学习渗透?

网络安全学海

黑客 网络安全 信息安全 WEB安全 渗透测试·

关于比特币和区块链的3件重要事项

CECBC

冒死上传!阿里内部最新版“SpringCloud Alibaba手册”细节拉满

Java 编程 架构 面试 架构师

连续两年的云上服贸会,一部会展行业的数智化启示录

脑极体

卖NFT表情包赚上百万,区块链技术终于找到了真正价值?

CECBC

linux之ssh-keygen命令

入门小站

Linux

百度清风算法再次升级:必须严打低质下载站

石头IT视角

MVP验证方向,差异化策略超越竞争

石云升

MVP 9月日更

架构实战营模块7课后作业

燕燕 yen yen

架构实战营

Mybatis的工作流程及原理

咿呀呀

mybatis 9月日更

从电视购物到电商直播,什么造就了「带货的参差」

融云 RongCloud

【LeetCode】数据流中的中位数Java题解

Albert

算法 LeetCode 9月日更

Promise.race() 原理解析及使用指南

devpoint

异步 Promise 9月日更

架构实战营模块七作业-游戏商城异地多活

王晓宇

架构实战营

小游戏 合成

游戏开发_软件开发

高并发系统SoEasy!Alibaba全新出品亿级并发设计速成笔记真香

Java 编程 架构 面试 架构师

模块七作业

秀聪

架构实战营

为什么说敏捷开发是应用程序的未来?

优秀

敏捷开发

压箱底宝藏!程序员必不可少的8款办公利器

Jackpop

金融科技成为服贸会热议话题:数字化转型中如何保障金融安全

CECBC

两种定时任务调度器对比

xyu

定时任务 Go 语言

太棒了!终于有大佬把“消息队列”核心知识点全都总结出来了

Java 编程 架构 面试 架构师

架构实战营 模块七 作业

一雄

作业 架构实战营 模块七

在线JSON转BigQuery工具

入门小站

从分子层面雕刻肌肉,新数学模型预测锻炼肌肉最优方式

脑极体

学习笔记:TCP传输控制协议(一)

姬翔

9月日更

自动交Y机器人开发|市值机器人源码搭建

量化系统19942438797

2021年最受欢迎的10款开源DevOps工具

Jackpop

从 ClickHouse 到自研 ByteHouse:实时数据分析场景下的优化实践

火山引擎开发者社区

Clickhouse

用友YonSuite在基于六力模型的SaaS产品中位居业界前列

海比研究院

一个有限状态机的C++实现_文化 & 方法_刘伟_InfoQ精选文章