本文共 3027 字,大约阅读时间需要 10 分钟。
static struct work_struct test_work; // 工作包的 结构体 // 工作队列中的成员 的 结构体也是这样子的static struct workqueue_struct * test_workqueue; // 工作者线程 和 工作队列的 抽象
INIT_WORK // 将 work_struct 与 工作包 主函数 绑定schedule_work // 封装了 queue_workqueue_work(struct workqueue_struct *,struct work_struct * ); // 将 工作包插入工作队列,唤醒工作者线程 // 工作包 是 第二个参数 // 工作者线程 和 工作队列是 第一个参数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 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 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_threadrepeat: set_current_state(TASK_INTERRUPTIBLE); process_scheduled_works process_one_work worker->current_func = work->func; worker->current_func(work); schedule goto repeat;
转载地址:http://zaigi.baihongyu.com/