linux tasklet 实例,linux tasklet工作队列

tasklet 常常在它们最初被提交的处理器上运行. 工作队列以相同地方式工作, 缺 省地.

内核代码可以请求工作队列函数被延后一个明确的时间间隔.

两者之间关键的不同是 tasklet 执行的很快, 短时期, 并且在原子态, 而工作队列函数 可能有高周期但是不需要是原子的.

每个机制有它适合的情形.

工作队列有一个 struct workqueue_struct 类型, 在

中定义. 一 个工作队列必须明确的在使用前创建, 使用一个下列的 2 个函数:

struct workqueue_struct *create_workqueue(const char

*name);

struct workqueue_struct

*create_singlethread_workqueue(const char *name);

每个工作队列有一个或多个专用的进程("内核线程"),

它运行提交给这个队列的函数. 如 果你使用 create_workqueue, 你得到一个工作队列它有一个专用的线程在系统的每个处 理器上. 在很多情况下, 所有这些线程是简单的过度行为;

如果一个单个工作者线程就足 够, 使用 create_singlethread_workqueue 来代替创建工作队列

提交一个任务给一个工作队列, 你需要填充一个 work_struct 结构. 这可以在编译时完 成, 如下:

DECLARE_WORK(name,

void (*function)(void *), void *data);

这里

name 是声明的结构名称, function 是从工作队列被调用的函数, 以及 data 是一 个传递给这个函数的值. 如果你需要建立

work_struct 结构在运行时, 使用下面 2 个宏 定义:

INIT_WORK(struct work_struct *work, void

(*function)(void *), void *data); PREPARE_WORK(struct work_struct *work, void

(*function)(void *), void *data);

INIT_WORK

做更加全面的初始化结构的工作; 你应当在第一次建立结构时使用它. PREPARE_WORK 做几乎同样的工作, 但是它不初始化用来连接 work_struct

结构到工作队 列的指针. 如果有任何的可能性这个结构当前被提交给一个工作队列, 并且你需要改变这 个队列, 使用 PREPARE_WORK 而不是

INIT_WORK.

有 2 个函数来提交工作给一个工作队列:

int queue_work(struct workqueue_struct *queue, struct

work_struct *work); int queue_delayed_work(struct workqueue_struct *queue,

struct work_struct

*work, unsigned long delay);

每个都添加工作到给定的队列.

如果使用 queue_delay_work, 但是, 实际的工作没有进 行直到至少 delay jiffies 已过去. 从这些函数的返回值是 0 如果工作被成功加入到队

列; 一个非零结果意味着这个 work_struct 结构已经在队列中等待, 并且第 2 次没有加 入.

在将来的某个时间, 这个工作函数将被使用给定的 data 值来调用. 这个函数将在工作者 线程的上下文运行,

因此它可以睡眠如果需要 -- 尽管你应当知道这个睡眠可能怎样影响

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值