状态和线程

真正的多线程是具备抢占式和内存共享两个特色,这也是致使多线程同步问题的根本缘由。而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
相关文章
相关标签/搜索