Lua学习笔记之协同程序
1、 协同程序与多线程情况下的线程比较类似,有自己的堆栈。自己的局部变量,有自己的指令指针,但是和其他协同程序共享全局变量等很多信息。线程和协同程序的主要不同在于:在多核处理器情况下,多线程程序同时运行多个线程,而协同程序是通过协作来完成,在任意指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才被挂起。
2、 协同的基础
Lua通过table提供了所有的协同函数,create函数创建一个新的协同程序,create只有一个参数,协同程序将要运行的代码封装而成的函数,返回值为thread类型的值表示创建了一个新的协同程序。
co =coroutine.create(function ()
print(“hi”)
end)
print(co) -->thread:Ox8071d98
协同有三个状态:挂起态、运行态、停止态。当我们创建一个协同程序时他开始的状态为挂起态,也就是说我们创建协同程序的时候不会自动运行,可以使用status函数检查协同的状态:
print(coroutine.status(co)) -->suspended
函数coroutine.resume可以使程序由挂起状态变为运行状态
coroutine.resume(co)
yield函数可以将正在运行的代码挂起:
co =corutine.create(function ()
for i=1,10 do
print(“co”,i)
coroutine.yield()
end
end)
3、 非抢占式多线程
Lua中的协同式一协作的多线程,每一个协同等于一个线程,yield-resum可以实现在线程中切换。然而与真正的多线程不同的是,协同式非抢占式的。当一个协同正在运行时,不能再外部终止它。只能通过显示的调用yield挂起它的执行。