gpt4 book ai didi

c++ - 如何在 C++ 中进行自动机/状态机编码?

转载 作者:太空狗 更新时间:2023-10-29 20:27:01 26 4
gpt4 key购买 nike

我在另一种编程语言中使用过它,它非常有用。

我找不到关于 C++ 的任何信息。

让我们以下面的代码为例:

void change();

enum
{
end = 0,
gmx
}

int
gExitType;

int main()
{
gExitType = end;
SetTimer(&change, 10000, 0);
return 0;
}

void ApplicationExit()
{
switch (gExitType)
{
case end:
printf("This application was ended by the server");
case gmx:
printf("This application was ended by the timer");
}
::exit(0);
}

void change()
{
gExitType = gmx;
ApplicationExit();
}

这就是我们在 C++ 中的做法,但是当使用状态机/自动机时,我可以在其他语言中做类似的事情:

void change();

int main()
{
state exitType:end;
SetTimer(&change, 10000, 0);
return 0;
}

void ApplicationExit() <exitType:end>
{
printf("This application was ended by the server");
}

void ApplicationExit() <exitType:gmx>
{
printf("This application ended by the timer");
}

void change()
{
state exitType:gmx;
ApplicationExit();
}

在我看来,这是一种非常优雅的实现方式。我将如何在 C++ 中执行此操作?这段代码似乎不起作用(显然我找不到任何与 C++ 相关的自动机)

澄清我的观点:

So what are the advantages to using this technique? Well, as you can clearly see the code is smaller; granted I added an enum to the first version to make the examples more similar but the ApplicationExit functions are definately smaller. It's also alot more explicit - you don't need large switch statements in functions to determine what's going on, if you wanted you could put the different ApplicationExits in different files to handle different sets of code independently. It also uses less global variables.

最佳答案

像 Boost.statecart 这样的 C++ 库专门尝试为编码状态机提供丰富的支持:
http://www.boost.org/doc/libs/1_54_0/libs/statechart/doc/tutorial.html

除此之外,对某些类型的状态机进行编码的一种非常优雅的方法是将它们定义为协程:
http://c2.com/cgi/wiki?CoRoutine
http://eli.thegreenplace.net/2009/08/29/co-routines-as-an-alternative-to-state-machines/

C++ 不直接支持协程,但有两种可能的方法实现它们:

1) 使用类似于实现 duff 设备的技术,详细解释如下:
http://blog.think-async.com/search/label/coroutines
例如,这与 C# 的迭代器的工作方式非常相似,并且一个限制是只能从协程调用堆栈中最顶层的函数生成协程。 OTOH,这种方法的优点是协程的每个实例只需要很少的内存。

2) 为每个协程分配一个单独的堆栈和寄存器空间。
这实质上使协程成为一个成熟的执行线程,唯一的区别是用户对线程调度负全部责任(也称为 cooperative multi-tasking )。
boost 提供了一个可移植的实现:
http://www.boost.org/doc/libs/1_54_0/libs/coroutine/doc/html/coroutine/intro.html

关于c++ - 如何在 C++ 中进行自动机/状态机编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17505804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com