linux工作队列 - workqueue

tasklet与workqueue区别

workqueue 详解  

对于内核现成的队列,我们INIT_WORK后直接用schedule_work加入系统默认的workqueue队列——keventd_wq并调度执行,对于我们从新创建的工作队列,需要用create_workqueue来创建work_queue,然后INIT_WORK,最后,还需要使用queue_work加入我们创建的工作队列并调度执行。

#include 
#include 
#include 
MODULE_AUTHOR("Li Jun");
/*测试数据结构*/
struct my_data
{
    struct work_struct my_work;
    int value; 
};

struct workqueue_struct *wq = NULL;
struct work_struct work_queue;

/*初始化我们的测试数据*/
struct my_data* init_data(structmy_data *md)

{
     md = (struct my_data*)kmalloc(sizeof(struct my_data),GFP_KERNEL);
     md->value = 1;
     md->my_work = work_queue;
     return md;
}

/*工作队列函数*/
static void work_func(struct work_struct *work)
{
     struct my_data *md = container_of(work, struct my_data, my_work);
     printk("<2>""Thevalue of my data is:%d\n",md->value);
}

static __init int work_init(void)
{
     struct my_data *md=NULL;
     struct my_data *md2=NULL;
     md2 = init_data(md2);
     md = init_data(md);     
     md2->value = 20;
     md->value = 10;
     /*第一种方式:使用系统默认的workqueue队列——keventd_wq,直接调度*/
     INIT_WORK(&md->my_work, work_func);
     schedule_work(&md->my_work);

 
     /*第二种方式:创建自己的工作队列,加入工作到工作队列(加入内核就对其调度执行)*/
     wq = create_workqueue("test");// or create_singlethread_workqueue
     INIT_WORK(&md2->my_work, work_func);
     queue_work(wq, &md2->my_work);    
     return 0;
}

static void work_exit(void)
{
     /*工作队列销毁*/
     destroy_workqueue(wq);
}

module_init(work_init);
module_exit(work_exit);

 

转载于:https://my.oschina.net/u/592470/blog/1502851

你可能感兴趣的:(linux工作队列 - workqueue)