linux work工作队列

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)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值