• 状态和线程


    真正的多线程是具有抢占式和内存共享两个特点,这也是导致多线程同步问题的根本原因。而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
  • 相关阅读:
    Path 环境变量
    Scala_ 类_可见性
    ubuntu16.04 注意特别出
    Python基础之文件操作
    python之set集合操作
    python数据类型之字典操作
    python的数据类型之列表list
    Python的条件控制及循环
    使用jmeter做接口测试
    AMD64 专业名词缩写
  • 原文地址:https://www.cnblogs.com/iRidescent-ZONE/p/5664550.html
Copyright © 2020-2023  润新知