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 91caefd79929d69869899fc82b83f3c7fb930950..9a3ef962e509f9571c9fcc1007f1f089356f9556 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 @@ -332,9 +332,12 @@ rt_thread_t rt_thread_self(void); rt_err_t rt_thread_yield(void); ``` -调用该函数后,当前线程首先把自己从它所在的就绪优先级线程队列中删除,然后把自己挂到这个优先级队列链表的尾部,然后激活调度器进行线程上下文切换(如果当前优先级只有这一个线程,则这个线程继续执行,不进行上下文切换动作)。 +调用该函数后,当前线程会把自己挂到这个优先级队列链表的尾部,然后激活调度器进行线程上下文切换(如果当前优先级只有这一个线程,则这个线程继续执行,不进行上下文切换动作)。 + +rt_thread_yield() 函数和 rt_schedule() 函数比较相像,但有相同优先级的其他就绪态线程存在且没有更高优先级的线程存在时,系统的行为却完全不一样。执行 rt_thread_yield() 函数后,当前线程肯定会被换出,相同优先级的下一个就绪线程将被执行。而执行 rt_schedule() 函数后,当前线程并不一定被换出,即使被换出,也不会被放到就绪线程链表的尾部。 +> [!NOTE] +> 注:rt_thread_yield()还做了上锁,修改当前线程状态的工作,最后调用了rt_schedule() 。rt_thread_yield()是面向用户的接口,rt_schedule()是内核实现调度的内部接口。一般情况下应调用rt_thread_yield()。 -rt_thread_yield() 函数和 rt_schedule() 函数比较相像,但在有相同优先级的其他就绪态线程存在时,系统的行为却完全不一样。执行 rt_thread_yield() 函数后,当前线程被换出,相同优先级的下一个就绪线程将被执行。而执行 rt_schedule() 函数后,当前线程并不一定被换出,即使被换出,也不会被放到就绪线程链表的尾部,而是在系统中选取就绪的优先级最高的线程执行(如果系统中没有比当前线程优先级更高的线程存在,那么执行完 rt_schedule() 函数后,系统将继续执行当前线程)。 ### 使线程睡眠