diff --git a/rt-thread-version/rt-thread-standard/programming-manual/thread/thread.md b/rt-thread-version/rt-thread-standard/programming-manual/thread/thread.md index 607cde90a4cd79c2e79a90b28630e1cf08d49d75..6ee7ca52106ecd2e61eadc6628db123590735c3f 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/thread/thread.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/thread/thread.md @@ -176,9 +176,6 @@ 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() 函数,将状态更改为关闭状态。 -> [!NOTE] -> 注:RT-Thread 中,实际上线程并不存在运行状态,就绪状态和运行状态是等同的。 - ### 系统线程 前文中已提到,系统线程是指由系统创建的线程,用户线程是由用户程序调用线程管理接口创建的线程,在 RT-Thread 内核中的系统线程有空闲线程和主线程。 @@ -377,7 +374,7 @@ rt_err_t rt_thread_suspend (rt_thread_t thread); | \-RT_ERROR | 线程挂起失败,因为该线程的状态并不是就绪状态 | > [!NOTE] -> 注:RT-Thread对此此函数有严格的使用限制,该函数只能使用来挂起当前线程(即自己挂起自己),不可以在线程A中尝试挂起线程B,而且在挂起线程自己后,需要立刻调用 `rt_schedule()` 函数进行手动的线程上下文切换。用户只需要了解该接口的作用即可,强烈不建议在程序中使用该接口,该接口可以视为是内部接口。这是因为A线程在尝试挂起B线程时,A线程并不清楚B线程正在运行什么程序,一旦B线程正在使用例如互斥量、信号量等影响、阻塞其他线程的内核对象,那么A线程尝试挂起B线程的操作将会引发连锁反应,严重危及系统的实时性(有些地方会将其描述为死锁,实际上这种现象不是死锁,但是也不比死锁好到哪去)。 +> 注:RT-Thread对此此函数有严格的使用限制,该函数只能使用来挂起当前线程(即自己挂起自己),不可以在线程A中尝试挂起线程B,而且在挂起线程自己后,需要立刻调用 `rt_schedule()` 函数进行手动的线程上下文切换。用户只需要了解该接口的作用即可,强烈不建议在程序中使用该接口,该接口可以视为是内部接口。这是因为A线程在尝试挂起B线程时,A线程并不清楚B线程正在运行什么程序,一旦B线程正在使用例如互斥量、信号量等影响、阻塞其他线程的内核对象,如果此时其他线程也在等待这个内核对象,那么A线程尝试挂起B线程的操作将会引发其他线程的饥饿,严重危及系统的实时性。 恢复线程就是让挂起的线程重新进入就绪状态,并将线程放入系统的就绪队列中;如果被恢复线程在所有就绪态线程中,位于最高优先级链表的第一位,那么系统将进行线程上下文的切换。线程恢复使用下面的函数接口: