黑铁时代
Programing is not only one kind of technology, but also one kind of art.

真正的多线程是具有抢占式和内存共享两个特点,这也是导致多线程同步问题的根本原因。而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

 

posted on 2016-07-12 18:41  黑铁时代  阅读(464)  评论(0编辑  收藏  举报