真正的多线程是具备抢占式和内存共享两个特色,这也是致使多线程同步问题的根本缘由。而lua中的线程并不存在这个问题,首先lua的线程的状态并不共享内存,其次lua的线程是协同工做的,并不是抢占式的。多线程
主线程:lua_State* L = luaL_newstate() 不只建立了一个lua状态,还建立了一个主线程,主线程不会自动回收,除非调用lua_close;函数
子线程:lua_State* L1 = lua_newthread(L) 建立了一个子线程,子线程引用和主线程相同的lua状态,可是子线程可能会被回收,若是但愿子线程不被回收,能够放置在注册表中;lua
理论上子线程能够作和主线程同样的事情,好比调用某个lua函数等,因为线程之间的lua状态是独立,所以lua提供了lua_xmove方法,可让数据在不一样的栈之间移动:spa
lua_xmove(fromState, toState, n) 将fromstate栈上的n个数据出栈,并压入tostate的栈中。线程
有了多线程就可使用lua中的协程了:code
在lua中有一个协程:协程
function thread1_func () print("thread1") local i = 1; repeat print("1") i = i + 1 if (i == 5) then coroutine.yield(34) // 挂起 end until i >= 100 return 123 end function start () return thread1_func() end
在c代码中使用它:blog
lua_State* L1 = lua_newthread(L); lua_getglobal(L, "start"); lua_xmove(L, L1, 1); int state = lua_resume(L1, L, 0); // 返回1,表示LUA_YIELD int state1 = lua_resume(L1, L, 0); // 返回0,表示LUA_OK