真正的多線程是具備搶佔式和內存共享兩個特色,這也是致使多線程同步問題的根本緣由。而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