对于内核现成的队列,我们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);