简介
- 结构体
static struct work_struct test_work;
// 工作包的 结构体
// 工作队列中的成员 的 结构体也是这样子的
static struct workqueue_struct * test_workqueue;
// 工作者线程 和 工作队列的 抽象
- api
INIT_WORK
// 将 work_struct 与 工作包 主函数 绑定
schedule_work
// 封装了 queue_work
queue_work(struct workqueue_struct *,struct work_struct * );
// 将 工作包插入工作队列,唤醒工作者线程
// 工作包 是 第二个参数
// 工作者线程 和 工作队列是 第一个参数
create_workqueue
// 创建一个 工作者线程 和 工作队列
详解
- create_workqueue 创建工作者线程和工作者线程中维护的队列
create_workqueue
alloc_workqueue
__alloc_workqueue_key
rescuer->rescue_wq = wq;
rescuer->task = kthread_create(rescuer_thread, rescuer, "%s", wq->name); // 创建一个工作者线程 rescuer_thread
wq->rescuer = rescuer;
rescuer->task->flags |= PF_NO_SETAFFINITY;
wake_up_process(rescuer->task);
- INIT_WORK 创建工作包
INIT_WORK
__INIT_WORK
do { \
__init_work((_work), _onstack); \
(_work)->data = (atomic_long_t) WORK_DATA_INIT(); \ // #define WORK_DATA_INIT() ATOMIC_LONG_INIT(WORK_STRUCT_NO_POOL)
INIT_LIST_HEAD(&(_work)->entry); \ // 用来挂载到 工作包队列
(_work)->func = (_func); \ // 工作包中的 核心函数
} while (0)
struct work_struct {
atomic_long_t data;
struct list_head entry;
work_func_t func;
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
WORK_STRUCT_NO_POOL = (unsigned long)WORK_OFFQ_POOL_NONE << WORK_OFFQ_POOL_SHIFT,
- schedule_work 将工作包提交到 event 工作者线程
schedule_work
queue_work
queue_work_on
__queue_work
pwq = per_cpu_ptr(wq->cpu_pwqs, cpu);
worklist = &pwq->pool->worklist;
insert_work(pwq, work, worklist, work_flags); // worklist 为 工作队列头
list_add_tail(&work->entry, head);
wake_up_worker(pool);
wake_up_process(worker->task);
还有一种 schedule_delayed_work / queue_delayed_work
延时提交工作包 ,用的 timer (api 为 add_timer) ,timer 的handler 为 delayed_work_timer_fn
- 工作者线程的运行 任何工作者线程的核心函数
rescuer_thread
repeat:
set_current_state(TASK_INTERRUPTIBLE);
process_scheduled_works
process_one_work
worker->current_func = work->func;
worker->current_func(work);
schedule
goto repeat;