如何 0 成本启动全员 AI 技能提升?戳> 了解详情
写点什么

一个有限状态机的 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:174083

评论

发布
暂无评论
  • 【云主机】2022 年云主机管理软件排行榜

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

    2022-06-06

  • 资料下载

    2023-09-27

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

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

    2021-11-19

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

    2023-02-15

  • MVCC 的机制初识

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

    2021-11-16

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

    2023-10-17

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

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

    2023-02-11

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

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

    2023-01-09

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

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

    2022-07-20

  • 状态机的概念与设计

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

    2023-02-09

  • Netty 常量池

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

    2021-11-11

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

    2023-10-17

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

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

    2023-02-11

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

    2022-11-21

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

    2022-12-30

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

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

    2023-02-11

  • DDD 建模案例分享

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

    2022-10-09

  • Verilog HDL 基本语法规则

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

    2023-01-28

  • Verilog HDL 仿真常用命令

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

    2023-01-27

发现更多内容

云高性能计算平台 CHPC 让企业的传统 HPC 玩出新花样

百度Geek说

百度智能云

打造企业专属人工智能助理

霍格沃兹测试开发学社

【YashanDB数据库】Yashandb表闪回业务表实践

YashanDB

yashandb 崖山数据库 崖山DB

24年湖北正规等保测评机构名称以及地址看这里!

行云管家

湖北 等保 等级测评

望繁信科技与金智维达成金融行业独家战略合作,共塑数字化转型新格局

望繁信科技

数字化转型 金融行业 流程挖掘 数字员工 流程智能

TextIn文档树引擎,助力RAG知识库问答检索召回能力提升

合合技术团队

科技 文档识别 PDF解析

仿冒网站横行,奥运会票务网站安全性遭质疑,SSL证书成关键

防火墙后吃泡面

供应行业怎么定义?行业也需要堡垒机吗?

行云管家

网络安全 堡垒机 供应行业

TapData 信创数据源 | 国产信创数据库 PolarDB MySQL 数据同步指南,加速国产化进程,推进自主创新建设

tapdata

小间距LED显示屏:新时代的传播利器

Dylan

媒体 时代 LED LED display LED显示屏

一键生成PPT?讯飞智文2.0迎来重磅升级!马斯克宣布人工智能模型Grok 2测试版即将发布|AI日报

可信AI进展

特权账号的“三生三世”:识别、监测、审计

极盾科技

数据安全 特权账号

工作中遇到的RSA问题,这里或许能找到答案

三七互娱后端技术团队

非对称加密 rsa

工作五年后,做技术还是做管理?

老张

技术管理 职场成长 技术专家

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