状态和线程

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

状态和线程的相关文章

Java多线程之线程的状态以及线程间协作通信导致的状态变换

一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线程创建完成时为新建状态,即new Thread(...),还没有调用start方法时,线程处于新建状态. Runnable:就绪状态,当调用线程的的start方法后,线程进入就绪状态,等待CPU资源.处于就绪状态的线程由Java运行时系统的线程调度程序(thread scheduler)来

Java线程状态、线程停止、线程阻塞

线程状态(五种状态) Java 线程的生命周期包括创建,就绪,运行,阻塞,死亡5 个状态.一个 Java 线程总是处于这 5 个生命周期状态之一,并在一定条件下可以在不同状态之间进行转换 . 创建状态 (New Thread) 在 Java 语言中使用 new操作符创建一个线程后,该线程仅仅是一个空对象,它具备了线程的一些特征,但此时系统没有为其分配资源,这时的线程处于创建状态. 就绪状态 (Runnable) 使用 start()方法启动一个线程后,系统为该线程分配了除 CPU 外的所需资源,

Java线程状态流转---线程

说明:线程共包括以下5种状态.1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runnable): 也被称为"可执行状态".线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程.例如,thread.start().处于就绪状态的线程,随时可能被CPU调度执行.3. 运行状态(Running) : 线程获取CPU权限进行执行.需要注意的是,线程只能从就

5. 线程的状态、线程的阻塞的方式

Java中线程的状态分为6种 初始(NEW)状态:新创建了一个线程对象,但还没有调用start()方法. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统称为"运行".线程对象创建后其他线程(比如main线程)调用了该对象的start()方法.该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权.此时处于就绪状态(ready).就绪状态的线程在获得cpu时间片后变为运行中状态(running) 阻塞(BLOCKED):

线程的状态与线程安全

线程也有生命周期,线程从创建到死亡会经历如下的过程: 创建(new)-->待运行(runnable)-->运行(running)-->死亡(dead) |_____阻塞______|(阻塞过程包含waiting.sleeping.yeild.join.blocked) 下面将一一讲诉具体的每个过程.前面讲到怎样创建一个线程,但创建完一个线程后此线程并不会马上进入到运行状态,而是要等分配到一定的资源(比如内存空 间)后变为runnable,当调用start()方法后,线程便开始运行.如果此

201709018工作日记--线程状态的转换

先来张图: 线程在一定条件下,状态会发生变化: 1.新建状态(New):新创建了一个线程对象 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权. 3.运行状态(Running):就绪状态的线程获取了CPU,执行程序代码. 4.阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行.直到线程进入就绪状态,才有机会转到运行状态.阻塞的情况分三种:   (一).等

Java多线程 2 线程的生命周期和状态控制

一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现Java.lang.IllegalThreadStateException异常. 2.就绪状态 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它

Java线程状态的改变

一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法. 2.可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态.当start()方法调用时,线程首先进入可运行状态.在线程运行之后或者从阻塞.等待或睡眠状态回来后,也返回到可运行状态. 3.运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态.这也是线

Java 线程的状态

Java Thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等 BLOCKED  这个状态下, 是在多个线程有同步操作的场景, 比如正在等待另一个线程的synchronized 块的执行释放, 或者可重入的 synchro