【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

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

评论

发布
暂无评论
发现更多内容

AIGC 对程序员的影响 | 社区征文

sidiot

AI AIGC 年中技术盘点

苹果APP安装包ipa如何安装在手机上

ios

晴数智慧张晴晴博士当选开放群岛开源社区「首席数据科学家」

Geek_2d6073

UINO优锘科技受邀在2023全球数字经济大会数字孪生赋能城市数字化转型论坛发表演讲

ThingJS数字孪生引擎

数字化转型 智慧城市 数字孪生 #web3D ThingJS

Docker学习路线3:安装设置

小万哥

Docker 容器 后端 开发 开发程序员

什么是HTML5?HTML5的含义、元素和好处

互联网工科生

html html5

基于Go语言的滴滴DevOps重塑之路

滴滴技术

DevOps 滴滴技术 #go

和鲸数据科学专家平台正式成立,凝聚专家资源推进产业数字化升级

ModelWhale

人工智能 数据科学 专家平台 专家资源

新兴技术的影响与展望:生成式AI及更多思考|社区征文

小诚信驿站

年中技术盘点

软件测试丨Docker环境安装配置(Mac、Windows、Ubuntu)

测试人

Docker ubuntu 软件测试 Mac windows

小度全屋智能携大模型应用惊艳亮相中国建博会,智慧体验演绎未来家居新标准

新消费日报

如果小程序越来越多,是不是会直接代替App?

Onegun

小程序 小程序容器

极光笔记 | 解锁Web推送的潜力:提升网站收入

极光JIGUANG

网站 营销 消息推送 推送

智能制造:低代码开发平台推动数智时代的巨变

EquatorCoco

人工智能 低代码 智能制造 数智化

你需要知道的Symbols

不在线第一只蜗牛

前端 symbol

华为云Astro低代码平台关键能力技术浅析

华为云PaaS服务小智

云计算 软件开发 低代码 华为云

TDengine 3.0 性能如何?教你一键复现 IoT 场景 TSBS 测试结果

爱倒腾的程序员

没收入是表象,UMU CEO李东朔的出海经验:第一年破100国家

B Impact

图加速数据湖分析-GeaFlow和Hudi集成

TuGraphAnalytics

数据湖 图计算 Hudi 数据湖分析 GeaFlow

云原生技术分享篇丨浅析Istio流量管理

inBuilder低代码平台

云原生

华为云命令行工具服务KooCLI助力一键管理云资源

华为云PaaS服务小智

云计算 软件开发 华为云

2023世界人工智能大会,和鲸科技入选中国信通院《2023大模型和AIGC产业图谱》

ModelWhale

人工智能 数据科学 大模型 AIGC 世界人工智能大会

IT行业都在用哪些进度跟踪工具

PingCode

IT 项目管理软件 项目进度管理

入选中国数据智能领域 IDC 创新者,柏睿数据创新实力再获肯定

新消费日报

初识滴滴交易策略之一:交易市场

滴滴技术

算法 滴滴技术

企业是如何做到持续规划的?

智达方通

全面预算管理 持续规划 年度计划流程

2023-07-12:RocketMQ如何做到消息不丢失?

福大大架构师每日一题

福大大架构师每日一题

Hybrid Embedding:蚂蚁集团万亿参数稀疏 CTR 模型解决方案

AI Infra

AI 开发者 海量存储 AI大模型 降本增效

低代码在边缘计算工业软件中的应用

力软低代码开发平台

生成式AI的发展、应用及影响 | 社区征文

Dec

年中技术盘点

倒计时 2 天|请收好 Kyligence 用户大会参会指南

Kyligence

数据分析 指标平台

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