[lua] coroutine学习小结

1060阅读 0评论2014-09-01 areece
分类:嵌入式

coroutine的三个状态:suspend, running, dead.
    新创建的coroutine处于suspend状态;
    resume使coroutine由suspend状态进入running态
    yield使coroutine进入suspend态。

    由于coroutine总是被resume调用而运行,yield看起来就象是resume的返回点,象函数return一样。
    如果要模拟出多线程的效果,就需要一个类似于coodinator的概念,它负责选择合适的coroutine,一会儿resume这个,一会儿resume那个。只不过,coroutine需要自已在合适的时候,yield而让出执行。如果需要更复杂的,类似OS的调度器,那么yield需要能够做得更复杂一点,即yield不仅把自已suspend住,还要以合适的策略挑选一个coroutine运行,嗯,就是resume它。

resume和yield的数据交换
    yield传给coroutine的主程序
    yield传给resume
    resume传给yield
    主程序的返回值给yield

    resume在coroutine的执行中更处于主导地位,它给coroutine提供参数,获取返回值,而coroutine的执行更被动一些,它执行,通过yield返回数据,让出CPU。所以在producer, consumer中,consumer用resume模拟,producer用yield模拟更自然合理。当然,也可以修改为生产者驱动,其语义上稍有不同而已。
上一篇:[lua] __call metamethod的用处
下一篇:[lua] metatable学习小结