C ++
我知道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;
}
}
};
当函数执行时,它会更新持久检查点变量。 下次调用时,该值将用于跳到执行的中间。 实际上,检查点不仅仅是一个int
而是包含“本地”变量。
我用C ++编写。 我的用例很少产生,所以我只想在异常处理期间更新检查点。
这种模式在实践中是已知的,还是仅仅被记录为好奇? C ++中是否存在可重用的实现?
(据我所知,Boost.Coroutine使用不合适的堆栈hack,与longjmp
多线程不同,我的应用程序很少使用协程控制流,堆栈使用可能在很多“线程”中非常高,所以它不适合这样的实现。)
C ++中是否存在可重用的实现?
本文还讨论了驻留在Boost.ASIO库中的一个头文件,无堆栈实现。
另一个ASIO头似乎表明他们已经离先前状态更远了一步,但我对这一点并不了解。 它可能与上一次相同或不一样。
前段时间,我使用标准C ++实现了可重用的堆栈协同程序,它允许您拥有局部变量(定义为协程类的成员)。 为了调用一个协程(我在我的实现中将其称为'纤维'),首先初始化一个用于包含状态的调用堆栈对象,然后启动协程。 以下是我如何定义协程的示例:
struct fiber_func_test
{ PFC_FIBER_FUNC();
// locals
unsigned loop_count;
// test function
fiber_func_test(unsigned loops_): loop_count(loops_) {}
bool tick(fiber_callstack &fc_, ufloat &dt_)
{
PFC_FIBER_BODY_BEGIN
while(loop_count--)
{
PFC_FIBER_CALL(fc_, dt_, fiber_func_sleep, (0.3f));
}
PFC_FIBER_BODY_END
}
};
loop_count是一个局部变量,其状态存储在堆栈中。 这就是它的名字:
fiber_callstack fc;
PFC_FIBER_START(fc, fiber_func_test, (10));
while(fc.tick(0.1f))
thread_nap();
这里是代码的链接:http://sourceforge.net/p/spinxengine/code/HEAD/tree/sxp_src/core/mp/mp_fiber.h
干杯,Jarkko
是的,它是存在的,被记录并用于众所周知的分布式应用程序(Putty,不是C ++)。
另一个关于Duff设备使用的页面:
达夫甚至评论了这种用法,说他用它作为中断驱动状态机(现在在流行词“Async”下已知):
上一篇: c++
下一篇: Implementing a finite state machine with a single coroutine