RT-Thread线程的状态

RT-Thread线程的状态
1.线程就绪表的初始状态。
此时线程的状态还处于初始态,线程刚创建还没开始运行时就处于初始状态;在初始状态下,线程不参与调度。此状态在 RT-Thread 中的宏定义为 RT_THREAD_INIT。此时就绪表各优先级成员均指向自身(这里prio_table[]数组下表即是线程的优先级)。相应地,线程就结优先级组rt_thread_ready_priority_group初始化为0。
RT-Thread线程的状态_第1张图片
2.线程就绪表插入就绪状态的线程
每创建一个新的线程,对应地,需要调用rt_thread_startup()函数启动该线程,首次执行该线程前,默认地将线程的tlist节点挂接在就绪表对应优先级的链表前面(如下图所示)。若同一优先级(x)有多个线程进入就绪态,则将线程的tlist节点依次插入就续表prio_table[x]元素前面。相应地,线程就绪优先级组rt_thread_ready_priority_group的位x置1,这里位x表示优先级为x至少有一个线程处于就绪态。
在就绪状态下,线程按照优先级排队,等待被执行;一旦当前线程运行完毕让出处理器,操作系统会马上寻找最高优先级的就绪态线程运行。此状态在 RT-Thread 中的宏定义为 RT_THREAD_READY。
RT-Thread线程的状态_第2张图片
3.线程进入挂起态
也称阻塞态。它可能因为资源不可用而挂起等待,或线程主动延时一段时间而挂起。在挂起状态下,线程不参与调度。此状态在 RT-Thread 中的宏定义为 RT_THREAD_SUSPEND。 进入挂起态的线程,首先要将其在就绪表对应优先级链表的tlist节点删除。此时,其节点tlist指向自己,是名副其实的孤立节点。
4.线程进入运行态
线程在进入运行态前,要将其tlist节点从就绪表中对应优先级下标的链表中删除,以避免再次成为就绪表中的最高优先级线程。若同优先级线程全部不在就绪态,线程就绪优先级组rt_thread_ready_priority_group的对应位就置0.然而,需要说明的是,此前处于运行态的线程需根据情况设置为挂起态、关闭态、就绪态等状态。
线程当前正在运行。在单核系统中,只有 rt_thread_self() 函数返回的线程处于运行状态;在多核系统中,可能就不止这一个线程处于运行状态。此状态在 RT-Thread 中的宏定义为 RT_THREAD_RUNNING。
5.关闭态的线程
关闭态的线程挂接在rt_thread_defunct链表当中。
当线程运行结束时将处于关闭状态。关闭状态的线程不参与线程的调度。此状态在 RT-Thread 中的宏定义为 RT_THREAD_CLOSE。

你可能感兴趣的:(RT-Thread)