工作队列 (三) 数据结构与api

简介

  • 结构体

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;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值