线程挂起

当线程调用rt_thread_delay,调用线程将主动挂起,当调用rt_sem_take,rt_mb_recv等函数时,资源不可使用也将导致调用线程挂起。处于挂起状态的线程,如果其等待的资源超时(超过其设定的等待时间),那么该线程将不再等待这些资源,并返回到就绪状态;或者,当其它线程释放掉该线程所等待的资源时,该线程也会返回到就绪状态。

线程挂起使用下面的函数接口:

  1. rt_err_t rt_thread_suspend (rt_thread_t thread);

线程安全

安全

中断例程

可调用

函数参数


  1. 参数 描述

  1. thread 线程句柄。

函数返回

如果这个线程的状态并不是就绪状态,将返回-RT_ERROR,否则返回RT_EOK

  • 注:通常不应该使用这个函数来挂起线程本身,如果确实需要采用rt_thread_suspend函数挂起当前任务,需要在调用rt_thread_suspend()函数后立刻调用rt_schedule()函数进行手动的线程上下文切换。
    线程挂起的例子如下:
  1. /*
  2. * 程序清单:挂起线程
  3. *
  4. * 这个例子中将创建两个动态线程(t1和t2)
  5. * 低优先级线程t1在启动后将一直持续运行;
  6. * 高优先级线程t2在一定时刻后唤醒并挂起低优先级线程。
  7. */
  8. #include <rtthread.h>
  9. #include "tc_comm.h"
  10.  
  11. /* 指向线程控制块的指针 */
  12. static rt_thread_t tid1 = RT_NULL;
  13. static rt_thread_t tid2 = RT_NULL;
  14. /* 线程1入口 */
  15. static void thread1_entry(void* parameter)
  16. {
  17. rt_uint32_t count = 0;
  18.  
  19. while (1)
  20. {
  21. /* 线程1采用低优先级运行,一直打印计数值 */
  22. rt_kprintf("thread count: %d\n", count ++);
  23. }
  24. }
  25.  
  26. /* 线程2入口 */
  27. static void thread2_entry(void* parameter)
  28. {
  29. /* 延时10个OS Tick */
  30. rt_thread_delay(10);
  31.  
  32. /* 挂起线程1 */
  33. rt_thread_suspend(tid1);
  34.  
  35. /* 延时10个OS Tick */
  36. rt_thread_delay(10);
  37.  
  38. /* 线程2自动退出 */
  39. }
  40.  
  41. int rt_application_init(void)
  42. {
  43. /* 创建线程1 */
  44. tid1 = rt_thread_create("t1",
  45. thread1_entry, /* 线程入口是thread1_entry */
  46. RT_NULL, /* 入口参数是RT_NULL */
  47. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  48. if (tid1 != RT_NULL)
  49. rt_thread_startup(tid1);
  50.  
  51. /* 创建线程2 */
  52. tid2 = rt_thread_create("t2",
  53. thread2_entry, /* 线程入口是thread2_entry */
  54. RT_NULL, /* 入口参数是RT_NULL */
  55. THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE);
  56. if (tid2 != RT_NULL)
  57. rt_thread_startup(tid2);
  58.  
  59. return 0;
  60. }