博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工作队列 (三) 数据结构与api
阅读量:4285 次
发布时间:2019-05-27

本文共 3027 字,大约阅读时间需要 10 分钟。

简介

  • 结构体
static struct work_struct test_work;    // 工作包的 结构体    // 工作队列中的成员 的 结构体也是这样子的static struct workqueue_struct * test_workqueue;    // 工作者线程 和 工作队列的 抽象
  • api
INIT_WORK    // 将 work_struct 与 工作包 主函数 绑定schedule_work    // 封装了 queue_workqueue_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_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/

你可能感兴趣的文章
TessorFlow学习 之 序言
查看>>
《图像处理实例》 之 二值图像分割
查看>>
Matplotlib模块
查看>>
StanFord ML 笔记 第一部分
查看>>
StanFord ML 笔记 第二部分
查看>>
StanFord ML 笔记 第三部分
查看>>
《图像处理实例》 之 局部极值提取
查看>>
硬盘读取不了-->>完美解决
查看>>
《图像处理实例》 之 拓扑重建
查看>>
《图像处理实例》 之 寻找图纸标注
查看>>
《图像处理实例》 之 拟合求交点
查看>>
《图像处理实例》 之 填充封闭区域
查看>>
《图像处理实例》 之 疏密程度统计
查看>>
支持向量机(理论+opencv实现)
查看>>
K-means算法(理论+opencv实现)
查看>>
高斯混合模型(理论+opencv实现)
查看>>
VS2015+Python3.5的配置
查看>>
分水岭算法(理论+opencv实现)
查看>>
《图像处理实例》 之 精确寻找一个圆
查看>>
opencv3.1+contrib的配置大总结(配置了两天,遇到问题无数)
查看>>