真正的多线程是具有抢占式和内存共享两个特点,这也是导致多线程同步问题的根本原因。而lua中的线程并不存在这个问题,首先lua的线程的状态并不共享内存,其次lua的线程是协同工作的,并非抢占式的。
主线程:lua_State* L = luaL_newstate() 不仅创建了一个lua状态,还创建了一个主线程,主线程不会自动回收,除非调用lua_close;
子线程:lua_State* L1 = lua_newthread(L) 创建了一个子线程,子线程引用和主线程相同的lua状态,但是子线程可能会被回收,如果希望子线程不被回收,可以放置在注册表中;
理论上子线程可以做和主线程一样的事情,比如调用某个lua函数等,由于线程之间的lua状态是独立,因此lua提供了lua_xmove方法,可以让数据在不同的栈之间移动:
lua_xmove(fromState, toState, n) 将fromstate栈上的n个数据出栈,并压入tostate的栈中。
有了多线程就可以使用lua中的协程了:
在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代码中使用它:
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