QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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

评论

发布
暂无评论
  • 状态机设计中的关键技术

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

    2023-02-11

  • 状态机的概念与设计

    一般情况下,状态触发器的数量是有限的,其状态数也是有限的,故称为有限状态机(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

  • Verilog HDL 仿真常用命令

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

    2023-01-27

  • Verilog HDL 基本语法规则

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

    2023-01-28

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

    2023-10-17

  • MVCC 的机制初识

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

    2021-11-16

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

    2022-12-30

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

    2023-02-15

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

    2023-10-17

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

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

    2021-11-19

  • 资料下载

    2023-09-27

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

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

    2023-02-11

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

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

    2022-07-20

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

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

    2023-01-09

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

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

    2022-06-06

  • DDD 建模案例分享

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

    2022-10-09

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

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

    2023-02-11

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

    2022-11-21

发现更多内容

一图看懂CodeArts Governance 三大特性,带你玩转开源治理服务

华为云PaaS服务小智

云计算 软件开发 华为云

深度学习应用开发示例之像素分割

矩视智能

深度学习 像素分割

Java基础面试题【七】线程池

派大星

Java 面试题

TiDB x Bolt丨超强可扩展性与弹性助力超 1 亿用户畅享出行服务

TiDB 社区干货传送门

测试过程效率的提升和演变

老张

软件测试 研发效能 质量保障

mac软件推荐:CAD迷你看图中文版

胖墩儿不胖y

Mac软件 cad软件 CAD看图工具

枚举探秘:Java中的神奇力量!

互联网工科生

枚举 java

英特尔宣布Intel 4已大规模量产,“四年五个制程节点”计划又进一步

E科讯

七个 LLM 的狼人杀之夜;马斯克的星链残骸会“砸死人”?OpenAI 安全漏洞曝光丨RTE开发者日报 Vol.66

声网

软件测试/测试开发丨Postman实战练习 学习笔记

测试人

Python 软件测试 测试开发

打造次世代分析型数据库(六):如何从零实现向量化引擎

腾讯云大数据

数据库

基于知识图谱建模、全文检索的智能知识管理库(源码)

金陵老街

java

Spring Cloud Gateway:打造可扩展的微服务网关

程序员万金游

#java #微服务 #Spring #SpringCloud

NSDT孪生编辑器助力智慧城市

3D建模设计

智慧城市 数字孪生

如何开发区块链应用程序:分步指南

区块链软件开发推广运营

交易所开发 dapp开发 区块链开发 链游开发 NFT开发

OpenHarmony社区运营报告(2023年9月)

OpenHarmony开发者

广交会场外蹭热度 第六届广州五金交易会如期召开!

极客天地

MySQL5.5安装教程

小齐写代码

业财融合潮流下,构建国有企业全面预算管理体系

智达方通

业财融合 全面预算管理

可完全替代FTP的文件传输工具大集合

镭速

文件传输工具 替代FTP FTP传输文件

如何借助CDC快速实现实时数据传输?

RestCloud

数据同步 ETL CDC

IPQ8074 Industrial Router with QCN9074/QCN9024 WiFi Network Card - Excellent performance and comprehensive coverage

wifi6-yiyi

QCN9074 IPQ8074

浅析斐波那契数列在代码中的应用

emanjusaka

Java 后端

TiDB 7.4 发版:正式兼容 MySQL 8.0

TiDB 社区干货传送门

企业如何选择安全又稳定的文件传输协议

镭速

大文件传输 文件传输协议

Postman 调试 WebSocket 接口完整指南

Liam

Postman websocket 接口调试 测试工具 API 测试

沐浴阳光,贴心陪伴,全屋智能大模型应用论坛即将发布小度全屋智能新产品

新消费日报

TiDB v7.4.0 版本上线啦!看看有没有你想要的功能上线啦!

TiDB 社区干货传送门

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