workqueue

1.什么是workqueue?

    Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程。

2.Workqueue机制的实现

Workqueue机制中定义了两个重要的数据结构,分析如下:

        1、cpu_workqueue_struct结构。该结构将CPU和内核线程进行了绑定。在创建workqueue的过程中,Linux根据当前系统CPU的个数创建cpu_workqueue_struct。在该结构主要维护了一个任务队列,以及内核线程需要睡眠的等待队列,另外还维护了一个任务上下文,即task_struct。

        2、work_struct结构是对任务的抽象。在该结构中需要维护具体的任务方法,需要处理的数据,以及任务处理的时间。该结构定义如下:

struct work_struct {

              unsigned long pending;

               struct list_head entry;                  

               void (*func)(void *);                   

               void *data;                                  

               void *wq_data;                           

               strut timer_list timer;                   

};

3.创建自己的工作队列来添加工作

  第一步:声明工作处理函数和一个指向工作队列的指针

  void my_func();

  struct workqueue_struct *p_queue;

  第二步:创建自己的工作队列和工作结构体变量(通常在open函数中完成)

  p_queue=create_workqueue("my_queue"); //创建一个名为my_queue的工作队列并把工作队列的入口地址赋给声明的指针

  struct work_struct my_work;

  INIT_WORK(&my_work, my_func, &data); //创建一个工作结构体变量并初始化,和第一种情况的方法一样

  第三步:将工作添加入自己创建的工作队列等待执行

  queue_work(p_queue, &my_work);

  //作用与schedule_work()类似,不同的是将工作添加入p_queue指针指向的工作队列而不是系统共享的工作队列

  第四步:删除自己的工作队列

  destroy_workqueue(p_queue); //一般是在close函数中删除




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值