Notes on learning RT-Thread——线程状态及状态转换

线程的状态

线程运行的过程中,同一时间内只允许一个线程在处理器中运行。在 RT-Thread 中,线程包含五种状态,操作系统会自动根据它运行的情况来动态调整它的状态。
RT-Thread 中线程的五种状态

初始状态 当线程刚开始创建还没开始运行时就处于初始状态;在初始状态下,线程不参与调度。此状态在 RT-Thread 中的宏定义为 RT_THREAD_INIT
就绪状态 在就绪状态下,线程按照优先级排队,等待被执行;一旦当前线程运行完毕让出处理器,操作系统会马上寻找最高优先级的就绪态线程运行。此状态在 RT-Thread 中的宏定义为 RT_THREAD_READY
运行状态 线程当前正在运行。在单核系统中,只有 rt_thread_self() 函数返回的线程处于运行状态;在多核系统中,可能就不止这一个线程处于运行状态。此状态在 RT-Thread 中的宏定义为 RT_THREAD_RUNNING
挂起状态 也称阻塞态。它可能因为资源不可用而挂起等待,或线程主动延时一段时间而挂起。在挂起状态下,线程不参与调度。此状态在 RT-Thread 中的宏定义为 RT_THREAD_SUSPEND
关闭状态 当线程运行结束时将处于关闭状态。关闭状态的线程不参与线程的调度。此状态在 RT-Thread 中的宏定义为 RT_THREAD_CLOSE

知识补充

这里补充一个关于阻塞,非阻塞,同步与异步的概念
同步:指下一步操作必须是在上一步操作得到回应之后得以执行,这次期间系统处于等待状态,无法进行其他操作。
示意图: 执行操作——>等待结果——>继续操作
异步:指不管上一步操作是否得到回应都可以继续进行其他操作,在得到回应之后再进行下一步操作。
示意图: 执行操作——>等待结果(可进行其他操作)——>继续操作
根据是否能得到及时的应答,若需要等待的是阻塞,否则为非阻塞。
它们之间的关系是

同步 阻塞 非阻塞
异步 非阻塞 非阻塞

进程的状态转换

RT-Thread 提供一系列的操作系统调用接口,使得线程的状态在这五个状态之间来回切换。
转换
状态切换
线程通过调用函数 rt_thread_create/init() 进入到初始状态(RT_THREAD_INIT);
初始状态的线程通过调用函数 rt_thread_startup() 进入到就绪状态(RT_THREAD_READY);
就绪状态的线程被调度器调度后进入运行状态(RT_THREAD_RUNNING);
当处于运行状态的线程调用 rt_thread_delay(),rt_sem_take(),rt_mutex_take(),rt_mb_recv() 等函数或者获取不到资源时,将进入到挂起状态(RT_THREAD_SUSPEND);
处于挂起状态的线程,如果等待超时依然未能获得资源或由于其他线程释放了资源,那么它将返回到就绪状态。
挂起状态的线程,如果调用 rt_thread_delete/detach() 函数,将更改为关闭状态(RT_THREAD_CLOSE);
而运行状态的线程,如果运行结束,就会在线程的最后部分执行 rt_thread_exit() 函数,将状态更改为关闭状态。

需要注意的是: RT-Thread 中,实际上线程并不存在运行状态,就绪状态和运行状态是等同的。

猜你喜欢

转载自blog.csdn.net/qq_42860728/article/details/89217094