我知道C和C++中有一种协程的习语或模式:
struct cofunctor {
int state = 0;
void operator () () {
switch ( state ) {
case 0: // Caller must initialize to 0
if ( bar1 ) return;
while ( bar2 ) {
state = 1; case 1:
if ( bar3 ) return;
state = 2; case 2:
if ( bar4 ) return;
}
state = 3; case 3:
return;
}
}
};
随着函数的执行,它会更新一个持久化的checkpoint变量。下次调用时,该值将被用于跳转到执行的中间部分。在实践中,checkpoint不仅仅是一个int类型变量,还可能包含“本地”变量。
我使用C++进行编写。我的应用场景很少出现,因此我希望仅在异常处理期间更新checkpoints。
这种模式是否被实际应用广泛?或者只是作为一种好玩的文档记录存在?在C++中是否存在可重复使用的实现?
(据我所知,Boost.Coroutine使用了不符合规范的堆栈hack,类似于longjmp多线程。我的应用程序很少使用coroutine控制流,并且在众多“线程”中堆栈使用可能非常高,因此不适合使用这种实现方式。)
state = 0;
从未被执行。它是为了清晰而添加的吗? - TobiasbarX
变量未定义。它们的含义是什么?你能发一个最小工作示例吗?如果bar2 && !(bar3 || bar4)
,那么你会进入无限循环。这是有意为之吗? - Tobiasstate = 0
应该是初始化。已修复。barX
只是代表随机条件。同样,意图是在if
语句之前发生某些事情。 - Potatoswatter