线程脱离

线程脱离将使线程对象在线程队列和内核对象管理器中被删除。线程脱离使用下面的函数:

  1. rt_err_t rt_thread_detach (rt_thread_t thread);

线程安全

安全

中断例程

可调用

函数参数


  1. 参数 描述

  1. thread 线程句柄,它应该是由rt_thread_init进行初始化的线程句柄。

函数返回

返回RT_EOK

  • 注:这个函数接口是和rt_thread_delete()函数相对应的, rt_thread_delete()函数操作的对象是rt_thread_create()创建的句柄,而rt_thread_detach()函数操作的对象是使用rt_thread_init()函数初始化的线程控制块。同样,线程本身不应调用这个接口脱离线程本身。
    线程脱离的例子如下所示:
  1. /*
  2. * 程序清单:线程脱离
  3. *
  4. * 这个例子会创建两个线程(t1和t2),在t2中会对t1进行脱离操作;
  5. * t1脱离后将不在运行,状态也更改为初始状态
  6. */
  7. #include <rtthread.h>
  8. #include "tc_comm.h"
  9.  
  10. /* 线程1控制块 */
  11. static struct rt_thread thread1;
  12. /* 线程1栈 */
  13. static rt_uint8_t thread1_stack[THREAD_STACK_SIZE];
  14. /* 线程2控制块 */
  15. static struct rt_thread thread2;
  16. /* 线程2栈 */
  17. static rt_uint8_t thread2_stack[THREAD_STACK_SIZE];
  18.  
  19. /* 线程1入口 */
  20. static void thread1_entry(void* parameter)
  21. {
  22. rt_uint32_t count = 0;
  23.  
  24. while (1)
  25. {
  26. /* 线程1采用低优先级运行,一直打印计数值 */
  27. rt_kprintf("thread count: %d\n", count ++);
  28. }
  29. }
  30.  
  31. /* 线程2入口 */
  32. static void thread2_entry(void* parameter)
  33. {
  34. /* 线程2拥有较高的优先级,以抢占线程1而获得执行 */
  35.  
  36. /* 线程2启动后先睡眠10个OS Tick */
  37. rt_thread_delay(10);
  38.  
  39. /*
  40. * 线程2唤醒后直接执行线程1脱离,线程1将从就绪线程队列中删除
  41. */
  42. rt_thread_detach(&thread1);
  43.  
  44. /*
  45. * 线程2继续休眠10个OS Tick然后退出
  46. */
  47. rt_thread_delay(10);
  48.  
  49. /*
  50. * 线程2运行结束后也将自动被从就绪队列中删除,并脱离线程队列
  51. */
  52. }
  53.  
  54. int rt_application_init(void)
  55. {
  56. rt_err_t result;
  57.  
  58. /* 初始化线程1 */
  59. result = rt_thread_init(&thread1, "t1", /* 线程名:t1 */
  60. thread1_entry, /* 线程的入口是thread1_entr */
  61. RT_NULL, /* 入口参数是RT_NULL*/
  62. &thread1_stack[0], /* 线程栈是thread1_stack */
  63. sizeof(thread1_stack),
  64. THREAD_PRIORITY, 10);
  65. if (result == RT_EOK) /* 如果返回正确,启动线程1 */
  66. rt_thread_startup(&thread1);
  67.  
  68. /* 初始化线程2 */
  69. result = rt_thread_init(&thread2, "t2", /* 线程名:t2 */
  70. thread2_entry, /* 线程的入口是thread2_entry */
  71. RT_NULL, /* 入口参数是RT_NULL*/
  72. &thread2_stack[0], /* 线程栈是thread2_stack */
  73. sizeof(thread2_stack),
  74. THREAD_PRIORITY - 1, 10);
  75. if (result == RT_EOK) /* 如果返回正确,启动线程2 */
  76. rt_thread_startup(&thread2);
  77.  
  78. return 0;
  79. }