zoukankan      html  css  js  c++  java
  • 第二十一讲 任务的删除

    任务删除主要完成的事情:

    1、从就绪列表,延时列表等里面删除。 2、任务释放占用的资源。

    任务删除的方式有两种:

    1、其他任务强制删除他。2、其他任务请求一个标志位,然后这个这个任务判断这个标志位是否有效,然后删除自己。

    删除的时候通常会设置一个删除回调函数,具体的资源释放都工作会放在回调函数中。

    task结构体中增加:
    {
        task->clean = (void(*)(void *))0;                   // 设置清理函数
        task->cleanParam = (void *)0;                       // 设置传递给清理函数的参数
        task->requestDeleteFlag = 0;                        // 请求删除标记
    }

    连接回调函数

    tTaskSetCleanCallFunc(tTask * task,void(*clean)deleteCallBack(void *para),void *para)
    {
            task->clran=deleteCallBack;
            task->clranParam=para;    
    }

    强制删除指定的任务

    void tTaskForceDelete (tTask * task) 
    {
        uint32_t status = tTaskEnterCritical();
    
        if (task->state & TINYOS_TASK_STATE_DELAYED) 
        {
            tTimeTaskRemove(task);
        }
        else if (!(task->state & TINYOS_TASK_STATE_SUSPEND))
        {
            tTaskSchedRemove(task);
        }
    
        // 删除时,如果有设置清理回调函数,则调用清理函数
        if (task->clean) 
        {
            task->clean(task->cleanParam); //调用回调函数
        }
    
        if (currentTask == task) 
        {
            tTaskSched();
        }
    
        // 退出临界区
        tTaskExitCritical(status); 
    }

    请求删除和检查请求比较简单,就是设置删除标志位和检查删除标志位。

    void tTaskRequestDelete (tTask * task)
    {
    
        uint32_t status = tTaskEnterCritical();
        task->requestDeleteFlag = 1;
        tTaskExitCritical(status); 
    }
    
    uint8_t tTaskIsRequestedDelete (void)
    {
        uint8_t delete;
        uint32_t status = tTaskEnterCritical();
        delete = currentTask->requestDeleteFlag;
        tTaskExitCritical(status); 
        return delete;
    }

    task运行tTaskIsRequestedDelete 后,发现有其他task删除自己,那就会调用函数删除自己。可以和强制删除函数对比看,还是比较类似的。

    void tTaskDeleteSelf (void)
    {
        uint32_t status = tTaskEnterCritical();
    
        // 任务在调用该函数时,必须是处于就绪状态,不可能处于延时或挂起等其它状态
        // 所以,只需要从就绪队列中移除即可
        tTaskSchedRemove(currentTask);
    
        // 删除时,如果有设置清理函数,则调用清理函数
        if (currentTask->clean)
        {
            currentTask->clean(currentTask->cleanParam);
        }
    
        // 接下来,肯定是切换到其它任务去运行
        tTaskSched();
        tTaskExitCritical(status);
    }

     这个例子还没涉及到堆栈的释放等等。

  • 相关阅读:
    Java 垃圾收集与内存回收
    Java 内存区域与内存溢出
    ubuntu 12 JDK 编译
    android Animation 动画绘制逻辑
    Java 部分排序算法
    Java Arrays 排序
    android 性能分析、优化
    利用Navicate把SQLServer转MYSQL的方法(连数据)
    解决Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) ";
    windows redis 连接错误Creating Server TCP listening socket 127.0.0.1:637 9: bind: No error
  • 原文地址:https://www.cnblogs.com/nasduc/p/8572635.html
Copyright © 2011-2022 走看看