智能体刷屏的背后,是 AI 应用拐点的来临?AICon 北京站议程重磅公布,50+ 硬核分享不容错过 了解详情
写点什么

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

评论

发布
暂无评论
  • MVCC 的机制初识

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

    2021-11-16

  • Netty 常量池

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

    2021-11-11

  • 状态机的概念与设计

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

    2023-02-09

  • 资料下载

    2023-09-27

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

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

    2022-07-20

  • DDD 建模案例分享

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

    2022-10-09

  • Verilog HDL 仿真常用命令

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

    2023-01-27

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

    2023-10-17

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

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

    2022-06-06

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

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

    2023-01-09

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

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

    2023-02-11

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

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

    2021-11-19

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

    2022-12-30

  • Verilog HDL 基本语法规则

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

    2023-01-28

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

    2023-02-15

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

    2022-11-21

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

    2023-10-17

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

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

    2023-02-11

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

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

    2023-02-11

发现更多内容

我的算法学习之路

熊斌

学习方法 算法 28天写作

HTTPS实现原理

架构精进之路

https 七日更 28天写作

西少爷肉夹馍的股权纠纷 | 视频号28天(22)

赵新龙

28天写作

低代码:Microsoft Power Platform

lidaobing

低代码 28天写作 Power Platform

LiteOS调测利器:backtrace函数原理知多少

华为云开发者联盟

架构 内存 函数 LiteOS backtrace

云算力挖矿系统开发app,矿机租赁交易平台搭建

v16629866266

大数据丨ClickHouse在京东能源管理平台的实践

京东科技开发者

数据库 大数据

扎根CNCF社区贡献五年是怎样的体验?听听华为云原生开源团队的负责人怎么说

华为云开发者联盟

容器 Volcano cncf kubeedge 代码开发

音视频传输协议众多, 5G时代不同业务应该如何选择?

华为云开发者联盟

5G 音视频 直播 流媒体

技术赋能教育,浅谈教育机构转型的制胜关键

华为云开发者联盟

音视频 在线教育

阿里巴巴管理三板斧

Ian哥

28天写作

碎碎念之「程序员的时间都花在了哪?」

Justin

设计原则 代码规范 28天写作 技术债

Serverless Kubernetes:理想,现实与未来

阿里巴巴云原生

Serverless 容器 运维 云原生 k8s

java中的类和object,其实没那么难~

田维常

类集

折腾CUDA环境,搭建TF2开发环境

IT蜗壳-Tango

七日更

创业失败启示录|老老王上的人生第一课

阿萌

28天写作 创业失败启示录 青城

创始人去世,股权怎么办?|视频号28天(21)

赵新龙

28天写作

个人隐私后续

张老蔫

28天写作

重温亮剑-感悟

superman

一文带你解读Volcano架构设计与原理

华为云开发者联盟

架构 Kubernetes 负载 Volcano 集群

“大禹针”在北江大堤上线,浪潮助力广东水利新基建落地

新基建

微服务转型系列1:农商行数字化转型的烦恼

BoCloud博云

微服务 银行数字化转型 API 服务治理

15道类和对象面试题,快看看自己会几道

田维常

类集

宅米网技术架构演进分析

Andy

666666666666666666666

Paul

大数据

大数据知识专栏 - MapReduce 的自定义分组求TopN

小马哥

大数据 hadoop mapreduce 七日更

机器学习·笔记之:Cost Function - Intuition II

Nydia

网站自动化任务脚本

Kylin

七日更

【JS】预编译

德育处主任

JavaScript 大前端 js 28天写作

凝聚人心并不难,小诀窍让团队跟你一条心

一笑

管理 激励 28天写作

企业级低代码平台的选型和建设思考

李小腾

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