线程状态

线程运行的过程中,一个时间内只允许一个线程在处理器中运行,从运行的过程上划分,线程有多种不同的运行状态,如运行态,非运行态等。在RT-Thread实时操作系统中,线程包含五种状态,操作系统会自动根据它运行的情况而动态调整它的状态。RT-Thread中的五种线程状态如下所示:

线程状态

RT-Thread实时操作系统提供一系列的操作系统调用接口,使得线程的状态在这五个状态之间来回的变换。例如一个就绪态的线程由于申请一个资源(例如使用rt_sem_take),而可能进入挂起态。又例如因为一个外部中断发生了,系统转入中断服务例程,在中断服务例程中释放了相应的资源,导致把等待在这个资源上的高优先级线程唤醒,改变其状态为就绪态,导致当前运行线程切换等等。

几种状态间的转换关系如 线程转换图 所示:

线程转换图

线程通过调用函数rt_thread_create/init进入到初始状态(RT_THREAD_INIT);再通过调用函数rt_thread_startup进入到就绪状态(RT_THREAD_READY);当处于就绪状态的线程调用rt_thread_delay,rt_sem_take,rt_mb_recv等函数或由于获取不到资源时,将进入到挂起状态(RT_THREAD_SUSPEND);处于挂起状态的线程,如果等待超时依然未能获得资源或由于其他线程释放了资源,那么它将返回到就绪状态。挂起状态的线程,如果调用rt_thread_delete/detach将更改为关闭状态(RT_THREAD_CLOSE);而运行状态的线程,如果运行结束会在线程最后部分执行rt_thread_exit函数而更改为关闭状态(RT_THREAD_CLOSE)。