Linux-workqueue讲解
1.workqueue是什么?workqueue是对内核线程封装的,用于处理各种工作项的一种处理方法,由于处理对象是用链表拼接一个个工作项,依次取出来处理,然后从链表中删除,就像一个队列排好队依次处理一样,所以也称工作队列。
所谓封装可以简单理解一个中转站,一边指向"合适"的内核线程,一边接受你丢过来的工作项,用结构体workqueue_struct表示,而所谓的工作项也是个结构体–work_struct,里面有个成员指针,指向你最终要实现的函数。
workqueue_struct
struct workqueue_struct {
struct list_head pwqs;
struct list_head list;
struct workqueue_attrs *unbound_attrs;
struct pool_workqueue *dfl_pwq;
char name[WQ_NAME_LEN];
unsigned int flags ____cacheline_aligned;
struct pool_workqueue __percpu *cpu_pwqs;
struct pool_workqueue __rcu *numa_pwq_tbl[];
};
work_struct
struct work_struct
{
atomic_long_t data; //函数的参数
struct list_head entry; //挂到链表
work_func_t func; //函数指针,指向你实现的函数功能
};
怎么使用?
简单示例1
#include#include #include #include struct workqueue_struct *workqueue_test; struct work_struct work_test; void work_test_func(struct work_struct *work) { printk("%s()n", __func__); mdelay(1000); //再次添加并启用内核线程执行 queue_work(workqueue_test, &work_test); } static int test_init(void) { printk("Hello,world!n"); workqueue_test = alloc_workqueue("workqueue_test", 0, 0); INIT_WORK(&work_test, work_test_func); queue_work(workqueue_test, &work_test); return 0; } static void test_exit(void) { printk("Goodbye,cruel world!n"); destroy_workqueue(workqueue_test); } module_init(test_init); module_exit(test_exit); MODULE_AUTHOR("Vedic "); MODULE_LICENSE("Dual BSD/GPL");



