原文参考: http://www.lua.org/pil/index.html
翻译本文章是个人爱好lua所至,转载请注明出处与作者.版权归原作者所有,未经允许不得将文章用于商业目的,否则造成的一切后果由该组织或个人承担,本人不承担任何法律及连带责任.请自觉遵守. 【程序编程相关:网络游戏同步】 【推荐阅读:关卡设计的艺术】感觉这一章翻译得不好,如果看起来觉得别扭请参考原文;另外欢迎对文章的翻译提出批评与建议,msn或email eyangzhou@hotmail.com 【扩展信息:防外挂系列】 9.coroutines 协同程序与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是与其他协同程序共享全局变量等很多信息.线程与协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起. 协同是非常强大的功能,但是用起来也很复杂.如果你第一次阅读本章时不理解本章中的例子请不要担心,你可以继续阅读本书的其他部分然后再回过头来阅读本章. 9.1 协同的基础 lua通过table提供了所有的协同函数,create函数创建一个新的协同程序,create只有一个参数:协同程序将要运行的代码封装而成的函数,返回值为thread类型的值表示创建了一个新的协同程序.通常情况下,create的参数是一个匿名函数: co = coroutine.create(function () print("hi") end) print(co) --> thread: 0x8071d98 协同有三个状态:挂起态,运行态,停止态.当我们创建一个协同程序时他开始的状态为挂起态,也就是说我们创建协同程序的时候不会自动运行,可以使用status函数检查协同的状态: print(coroutine.status(co)) --> suspended 函数coroutine.resume可以使程序由挂起状态变为运行态: coroutine.resume(co) --> hi 这个例子中,协同体仅仅打印出"hi"之后便进入终止状态 print(coroutine.status(co)) --> dead 当目前为止,协同看起来只是一种复杂的调用函数的方式,真正的强大之处体现在yield函数,它可以将正在运行的代码挂起,看一个例子: co = coroutine.create(function () for i=1,10 do print("co", i) coroutine.yield() end end) 现在重新执行这个协同程序,程序将在第一个yield处被挂起: coroutine.resume(co) --> co 1 print(coroutine.status(co)) --> suspended 从协同的观点看:使用函数yield可以使程序挂起,当我们激活被挂起的程序时,yield返回并继续程序的执行直到再次遇到yield或者程序结束. coroutine.resume(co) --> co 2 coroutine.resume(co) --> co 3 ... coroutine.resume(co) --> co 10 coroutine.resume(co) -- prints nothing 上面最后一次调用的时候,协同体已经结束,因此协同程序处于终止状态.如果我们仍然企图激活他,resume将返回false与错误信息. ... 下一页