linux工作队列并行,linux工作队列 - 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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值