在 C 中使用 while(1) 循环作为临时状态机?

Using a while(1) loop as a makeshift state machine in C?

所以我看到很多关于在 C 中实现状态机的建议都涉及状态结构等,但我想知道为什么我们不能只对非常简单的状态机使用 while(1)。例如,

 int currentstate = state1;

 void state1function(){
    dosomething();
    if(user chooses to go to state 2){
       currentstate = state2;
    }
 }

 int main{
    while(1){
       if(currentstate == state1){
          state1function();
       }
       else if (currenstate == state2){
          state2function();
 }

基本上在全局变量中跟踪状态,并在 while 循环中根据状态调用函数。这对我来说似乎很简单,我真的不明白为什么它不起作用。

谁能告诉我为什么不work/would不推荐这样的东西?

谢谢

没有等待的while循环会消耗很多CPU。我认为使用互斥量或信号量的事件机制会很有用。

C 不是异步的(默认)。无限循环只会使您的程序 "freeze" 直到结果完成。

根据您要解决的问题,全局或静态是一种直接的解决方案。当您需要同时管理多个状态机时,使用结构会派上用场,and/or 当您需要从多个线程或进程更改状态时。

迟早,使用这种方法,您会发现拥有以下内容会很方便:

  • 显式转换 table。
  • OnEntry(), OnExit(), Do(), OnEvent() 每个州的功能。
  • 对转换执行的操作。
  • 守卫。 (触发转换的明确条件)
  • 嵌套状态机。
  • 并发状态机。含义:多个FSM 运行彼此相邻。
  • 通信并发嵌套状态机。

沿着这个复杂阶梯的某个地方,您很可能会放弃蛮力风格,您开始时可能看起来像您在问题中提供的代码。

while(1) 构造与状态机完全无关。只要单个执行线程(main() 或 OS 线程)是 long-运行,就使用它,因为它们通常在嵌入式系统或服务器应用程序上。如果应用程序是以状态机的形式或其他形式编写的,则无所谓。