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 ++)。

  • http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
  • 另一个关于Duff设备使用的页面:

  • http://research.swtch.com/duff
  • 达夫甚至评论了这种用法,说他用它作为中断驱动状态机(现在在流行词“Async”下已知):

  • http://brainwagon.org/2005/03/05/coroutines-in-c/
  • 链接地址: http://www.djcxy.com/p/53201.html

    上一篇: c++

    下一篇: Implementing a finite state machine with a single coroutine