linux work工作队列
1.工作队列的介绍
工作队列常用来在特定的时间间隔或者其他情况来执行一些动作,每个工作队列都有一个或者多个的线程(通常来说都是一个线程),在每个
线程中执行相应的任务。
2.工作队列的使用
1.work的相关函数的介绍以及用法
//头文件
#include <linux/workqueue.h>
//work中分为不延迟执行和延迟执行,意思是调用执行work的函数时,执行当前工作的队列是否需要延迟执行
typedef void (*work_func_t)(struct work_struct *work);
struct work_struct {
atomic_long_t data;
struct list_head entry;
work_func_t func;
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
//初始化work
#define INIT_WORK(_work, _func) \
__INIT_WORK((_work), (_func), 0)
//执行work,实际上调用的是queue_work,把当前的work加入到system的wq当中执行
schedule_work(struct work_struct *work);
//初始化delay_work
#define INIT_DELAYED_WORK(_work, _func) \
__INIT_DELAYED_WORK(_work, _func, 0)
//对应的结构体delayed_work相比work_struct 多出了一个定时器
struct delayed_work {
struct work_struct work;
struct timer_list timer;
/* target workqueue and CPU ->timer uses to queue ->work */
struct workqueue_struct *wq;
int cpu;
};
//执行work
schedule_delayed_work(struct delayed_work *dwork,
unsigned long delay)
//取消work
cancel_delayed_work(struct delayed_work *dwork)
//取消work 直到完成
cancel_delayed_work_sync(struct delayed_work *dwork)
2.队列中work的使用
work example:
struct delayed_work {
struct work_struct *work;
work_func_t led_fun;
}
void led_blink(struct work_struct *work)
{;
}
struct led_work * led_work;
led_work->led_fun = led_blink;
INIT_DELAYED_WORK(led_work->work, led_work->led_fun);
schedule_delayed_work(led_work->work, H/100);
//cancel work
cancel_delayed_work(led_work->work);
workqueue example:
struct delayed_work {
struct work_struct *work;
work_func_t led_fun;
struct workqueue_struct *wq;
}
void led_blink(struct work_struct *work)
{;
}
struct led_work * led_work;
led_work->led_fun = led_blink;
led_work->wq = create_singlethread_workqueue("queue");
INIT_DELAYED_WORK(led_work->work, led_work->led_fun);
queue_work(led_work->wq, led_work->work);
//cancel workqueue
destroy_workqueue(led_work->wq);
3.工作队列的创建
//通常创建工作队列有两种方法,其中的区别是针对多个核的cpu,create_singlethread_workqueue只会在单个cpu上创建workqueue而create_workqueue是在多个核上同时创建,schedule_work是吧当前的work加入到systemwq工作队列中,而queue_work可以指定队列把当前的work加入到队列中
//用户自行创建的工作队列的优点是不需要看工作的时间 影响内核systemwq的调度
create_singlethread_workqueue(name);
create_workqueue(name);