线程挂起
当线程调用rt_thread_delay,调用线程将主动挂起,当调用rt_sem_take,rt_mb_recv等函数时,资源不可使用也将导致调用线程挂起。处于挂起状态的线程,如果其等待的资源超时(超过其设定的等待时间),那么该线程将不再等待这些资源,并返回到就绪状态;或者,当其它线程释放掉该线程所等待的资源时,该线程也会返回到就绪状态。
线程挂起使用下面的函数接口:
- rt_err_t rt_thread_suspend (rt_thread_t thread);
线程安全
安全
中断例程
可调用
函数参数
- 参数 描述
- thread 线程句柄。
函数返回
如果这个线程的状态并不是就绪状态,将返回-RT_ERROR,否则返回RT_EOK
- 注:通常不应该使用这个函数来挂起线程本身,如果确实需要采用rt_thread_suspend函数挂起当前任务,需要在调用rt_thread_suspend()函数后立刻调用rt_schedule()函数进行手动的线程上下文切换。
线程挂起的例子如下:
- /*
- * 程序清单:挂起线程
- *
- * 这个例子中将创建两个动态线程(t1和t2)
- * 低优先级线程t1在启动后将一直持续运行;
- * 高优先级线程t2在一定时刻后唤醒并挂起低优先级线程。
- */
- #include <rtthread.h>
- #include "tc_comm.h"
- /* 指向线程控制块的指针 */
- static rt_thread_t tid1 = RT_NULL;
- static rt_thread_t tid2 = RT_NULL;
- /* 线程1入口 */
- static void thread1_entry(void* parameter)
- {
- rt_uint32_t count = 0;
- while (1)
- {
- /* 线程1采用低优先级运行,一直打印计数值 */
- rt_kprintf("thread count: %d\n", count ++);
- }
- }
- /* 线程2入口 */
- static void thread2_entry(void* parameter)
- {
- /* 延时10个OS Tick */
- rt_thread_delay(10);
- /* 挂起线程1 */
- rt_thread_suspend(tid1);
- /* 延时10个OS Tick */
- rt_thread_delay(10);
- /* 线程2自动退出 */
- }
- int rt_application_init(void)
- {
- /* 创建线程1 */
- tid1 = rt_thread_create("t1",
- thread1_entry, /* 线程入口是thread1_entry */
- RT_NULL, /* 入口参数是RT_NULL */
- THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
- if (tid1 != RT_NULL)
- rt_thread_startup(tid1);
- /* 创建线程2 */
- tid2 = rt_thread_create("t2",
- thread2_entry, /* 线程入口是thread2_entry */
- RT_NULL, /* 入口参数是RT_NULL */
- THREAD_STACK_SIZE, THREAD_PRIORITY - 1, THREAD_TIMESLICE);
- if (tid2 != RT_NULL)
- rt_thread_startup(tid2);
- return 0;
- }