本章节介绍工作队列(workqueue),用户只需要创建一个workqueue,则可以完成多个挂接不同处理函数的工作队列。

概述

在一个操作系统中,如果我们需要进行一项工作处理,往往需要创建一个任务来加入内核的调度队列。一个任务对应一个处理函数,如果要进行不同的事务处理,则需要创建多个不同的任务。任务作为cpu调度的基础单元,任务数量越大,则调度成本越高。工作队列(workqueue)机制简化了基本的任务创建和处理机制,一个workqueue对应一个实体task任务处理,workqueue下面可以挂接多个work实体。

当某些实时性要求较高的任务中,需要进行较繁重钩子处理时,可以将其处理函数挂接在workqueue中,其执行过程将位于workqueue的上下文,而不会占用原有任务的处理资源。workqueue还提供了work的延时处理机制,用户可以选择立即执行或是延时处理。

由此可见,我们在需要创建大量实时性要求不高的任务时,可以使用workqueue来统一调度;或者将任务中实时性要求不高的部分处理延后到workqueue中处理。如果需要设置延后处理,则需要使用work机制。另外该机制不支持周期work的处理。

工作队列功能的相关源码位于/kernel/rhino/目录中。(v2.1.0之前位于/kernel/rhino/core/目录中)。

头文件内容包含如下:
#include <aos/aos.h>
#include <aos/kernel.h>
#include "k_workqueue.h"

API列表

API名称 说明
aos_workqueue_create() 创建一个工作队列,内部会创建一个任务关联workqueue
aos_work_init() 初始化一个work,暂不执行
aos_work_destroy() 删除一个work
aos_work_run() 运行一个work,使其在某worqueue内调度执行
aos_work_sched() 运行一个work,使其在默认工作队列g_workqueue_default内调度执行
aos_work_cancel() 取消一个work,使其从所在的工作队列中删除

aos_workqueue_create()

定义描述
定义 描述
函数原型 int aos_workqueue_create(aos_workqueue_t *workqueue, int pri, int stack_size)
描述 创建一个工作队列,内部会创建一个任务关联workqueue
入参
  • workqueue:工作队列描述结构体指针;需要用户定义一个workqueue结构体
  • pri: 工作队列优先级,实际是关联任务优先级
  • stack_size:任务栈大小(单位:字节)
返回值 类型:int,返回成功或失败

调用示例

具体请参见调用示例

aos_work_init()

定义描述
定义 描述
函数原型 int aos_work_init(aos_work_t *work, void (*fn)(void *), void *arg, int dly)
描述 初始化一个work,暂不执行
入参
  • work:work工作描述结构体指针;需要用户定义一个work结构体
  • fn:work回调处理函数
  • arg:work回调处理参数
  • dly:延迟处理时间,单位ms,0表示不延迟
返回值 类型:int,返回成功或失败

调用示例

具体请参见调用示例

aos_work_destroy()

定义描述
定义 描述
函数原型 void aos_work_destroy(aos_work_t *work)
描述 删除一个work
入参 work:work工作描述结构体指针
返回值

调用示例

具体请参见调用示例

aos_work_run()

定义描述
定义 描述
函数原型 int aos_work_run(aos_workqueue_t *workqueue, aos_work_t *work)
描述 运行一个work,使其在某worqueue内调度执行
入参
  • workqueue:工作队列描述结构体指针
  • work:需要执行的工作描述结构体指针
返回值 类型:int,返回成功或失败

调用示例

具体请参见调用示例

aos_work_sched()

定义描述
定义 描述
函数原型 int aos_work_sched(aos_work_t *work)
描述 运行一个work,使其在默认工作队列g_workqueue_default内调度执行
入参 work:需要执行的工作描述结构体指针
返回值 类型:int,返回成功或失败

调用示例

具体请参见调用示例

aos_work_cancel()

定义描述
定义 描述
函数原型 int aos_work_cancel(aos_work_t *work)
描述 取消一个work,使其从所在的工作队列中删除
入参 work:需要取消的工作描述结构体指针
返回值 类型:int,返回成功或失败

调用示例

具体请参见调用示例

调用示例

创建一个工作队列,初始化一个work,把这个work加入到这个工作队列中,主线程等待,work执行,work执行完毕销毁。
static aos_workqueue_t workqueue;
static aos_work_t      work;
static aos_sem_t       sync_sem;

static void workqueue_custom(void *arg)
{
    aos_msleep(1000);
    printf("workqueue custom");
aos_sem_signal(&sync_sync_sem);
}

static void test_workqueue()
{
    int ret = 0;
    aos_sem_new(&sync_sem, 0);

    /* 创建一个工作队列workqueue,内部会创建一个任务关联该workqueue */
    aos_workqueue_create(&workqueue, 10, 1024);
    /* 初始化一个work,暂不执行,等待run */
    aos_work_init(&work, workqueue_custom, NULL, 100);

    /* 运行work,使其在某worqueue内调度执行 */
    aos_work_run(&workqueue, &work);
    /* sem等待,workqueue_custom得到执行 */
    aos_sem_wait(&sync_sem, AOS_WAIT_FOREVER);

    /* 释放sem */
    aos_sem_free(&sync_sem);
    /* 销毁work */
    aos_work_destroy(&work);
}

/* aos_work_cancel(aos_work_t *work) */
/* 删除work前,要确保work没有正在或将要被worqueue执行,否则会返回错误 */
/* 删除workqueue需要确保没有待处理或正在处理的wok,否则会返回错误 */