狀態和線程

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