10 月 23 - 25 日,QCon 上海站即将召开,现在大会已开始正式报名,可以享受 8 折优惠 了解详情
写点什么

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

评论

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

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

    2023-02-11

  • 状态机的概念与设计

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

    2023-02-09

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

    2023-10-17

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

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

    2021-11-19

  • 资料下载

    2023-09-27

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

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

    2022-06-06

  • DDD 建模案例分享

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

    2022-10-09

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

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

    2023-01-09

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

    2022-11-21

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

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

    2023-02-11

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

    2022-12-30

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

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

    2023-02-11

  • Verilog HDL 基本语法规则

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

    2023-01-28

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

    2023-10-17

  • Netty 常量池

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

    2021-11-11

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

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

    2022-07-20

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

    2023-02-15

  • MVCC 的机制初识

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

    2021-11-16

  • Verilog HDL 仿真常用命令

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

    2023-01-27

发现更多内容

【玩转金融素材生成】探索交互式AIGC组合素材生成技术

京东科技开发者

云管平台供应商大汇总看这里!

行云管家

云计算 云服务 云管平台 云管理

做梦都想拥有的陪伴对象,AI居然免费帮我实现了...文中附送体验地址!

可信AI进展

中国AI开发者应用生态调研报告

易观分析

NPM 包开发与优化全面指南

Immerse

npm package.json

怎样在 10k 个 H100 GPU 上训练模型?

Baihai IDP

程序员 AI gpu LLMs Baihai IDP

Spring 应用合并之路(一):摸石头过河

京东科技开发者

人工智能 | 智谱 AI 大模型

测试人

人工智能 软件测试

Lazada淘宝详情API的价值与应用解析

科普小能手

API 接口 API 测试 lazada商品数据接口 lazada API接口 lazada API

Go 错误处理指北:Defer、Panic、Recover 三剑客

江湖十年

面试 Go web 后端】

Parallels Desktop 19 for Mac(PD19虚拟机)一键激活版

Rose

克拉玛依等保测评机构有哪些?电话多少?

行云管家

网络安全 等保 等保测评

结构仿真流体仿真热仿真分析咨询报价 点击友商科技

极客天地

腾讯TVQA斩获ECCV 2024压缩视频质量评估比赛冠军

极客天地

数据驱动营销:淘宝商品详情API助力电商运营精准制胜

代码忍者

API 接口 pinduoduo API

重工业数字化转型创新实践:某国家特大型钢铁企业如何快速落地基于实时数仓的数据分析平台

tapdata

钢铁行业数字化转型 实时数仓解决方案 hive数据如何同步到doris oracle数据同步方案 mysql数据复制

AlDente Pro for Mac:保护电池健康的小工具

Rose

数字身份发展趋势前瞻:零信任

芯盾时代

数字身份 iam 零信任 统一身份管理平台

文档管理系统

深圳亥时科技

Microsoft Remote Desktop:在不同设备之间轻松地共享文件和资源

Rose

Autodesk AutoCAD 2024 Mac中文破解版 cad2024下载安装

Rose

OpenAI被爆12月发布其Orion AI模型!波兰“OFF”电台解雇所有记者,启用AI“主持人”|AI日报

可信AI进展

数据开发革新篇:逻辑数据编织平台重塑开发流程

Aloudata

数据仓库 数据分析 数据开发 数据虚拟化 数据编织

Downie 4 :流行的 Mac 视频下载工具

Rose

Microsoft Office LTSC 2024 Mac版安装包 附破解工具

Rose

【转载】把大模型做实 把供应链做透: 京东推出言犀大模型

京东科技开发者

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