当前位置: 代码迷 >> 综合 >> rtthread 主动挂起线程
  详细解决方案

rtthread 主动挂起线程

热度:27   发布时间:2023-10-21 23:07:45.0

rtthread 主动挂起(SUSPEND)线程

一、挂起其他线程

/** 程序清单:创建、启动、挂起、恢复线程** 这个例子会创建两个动态线程:tid1和tid2有相同的优先级,tid1线程中因无delay延时,start后tid1始终处于READY态,也正是因为这个前提,tid2才能够成功将tid1挂起。* 现象:每隔20s(200ms*100),tid1被tid2挂起或恢复一次。*/
rt_thread_t my_tid1 = RT_NULL, my_tid2 = RT_NULL;void my_tid1_thread_entry(void* params)
{
    int cnt = 0;rt_kprintf("enter my_tid1, priority = %d, status=%d\n", my_tid1->current_priority, my_tid1->stat);while(1){
    cnt++;if(cnt%1000000 == 0)rt_kprintf("this is my_tid1, cnt = %d\n", cnt);}
}void my_tid2_thread_entry(void* params)
{
    int cnt = 0, ret = 0;rt_kprintf("enter my_tid2, priority = %d, status=%d\n", my_tid2->current_priority, my_tid2->stat);while(1){
    cnt++;rt_kprintf("this is my_tid2, cnt = %d\n", cnt);rt_thread_mdelay(200);if(cnt%100 == 0){
    if(my_tid1->stat == RT_THREAD_SUSPEND){
    ret = rt_thread_resume(my_tid1);	rt_kprintf("============resume tid1 ret=%d ============\n",ret);}else if(my_tid1->stat == RT_THREAD_READY){
    ret = rt_thread_suspend(my_tid1);rt_kprintf("============suspend tid1 ret=%d ============\n",ret);}}}
}void suspend_resume_test(int argc, char* argv[])
{
    	if(RT_NULL == my_tid1){
    my_tid1 = rt_thread_create("my_tid1", my_tid1_thread_entry, NULL, THREAD_STACK_SIZE, RT_THREAD_PRIORITY_MAX - 4, THREAD_TIMESLICE);if(RT_NULL != my_tid1)rt_thread_startup(my_tid1);}if(RT_NULL == my_tid2){
    my_tid2 = rt_thread_create("my_tid2", my_tid2_thread_entry, NULL, THREAD_STACK_SIZE, RT_THREAD_PRIORITY_MAX - 4, THREAD_TIMESLICE);if(RT_NULL != my_tid2)rt_thread_startup(my_tid2);}
}
MSH_CMD_EXPORT(suspend_resume_test, suspend_resume_test);

二、挂起自身线程

通常不应该使用rt_err_t rt_thread_suspend(rt_thread_t thread)来挂起线程本身,如果确实需要采用 rt_thread_suspend() 函数挂起当前任务,需要在调用 rt_thread_suspend() 函数后立刻调用 rt_schedule() 函数进行手动的线程上下文切换。只需要了解,不推荐使用。