您的位置:首页 > 其它

工作队列使用方法(2.6.20之后)

2013-06-28 14:58 260 查看
工作队列在2.6.20之后
entry和之前的版本相同,func和data发生了变化,另外并无其他的变量。
entry我们不去过问,

data是之前版本的pending和wq_data的复合体,起到了以前的pending和wq_data的作用。

func的参数是一个work_struct指针,指向的数据就是定义func的work_struct。

2.6.20版本之后使用工作队列需要把work_struct定义在用户的数据结构中,然后通过container_of来得到用户数据。具体用法可以参考稍后的例子。

delayed_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;
};
用到得函数增加如下:

INIT_WORK(struct work_struct *work, work_func_t func);
INIT_DELAYED_WORK(struct delayed_work *work, work_func_t func);
int schedule_work(struct work_struct *work);
int schedule_delayed_work(struct delayed_work *work, unsigned long delay);
struct workqueue_struct *create_workqueue(const char *name);
int queue_work(struct workqueue_struct *wq, struct work_struct *work);
int queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work, unsigned long delay);
void flush_scheduled_work(void);
void flush_workqueue(struct workqueue_struct *wq);
int cancel_delayed_work(struct delayed_work *work);
void destroy_workqueue(struct workqueue_struct *wq);
其中得
queue_delayed_work
可以用来做延时处理具体如下:

struct delayed_work {
struct work_struct work;
struct timer_list timer;
};


例子如下:

struct my_struct_t {
char *name;
struct work_struct my_work;
};

void my_func(struct work_struct *work)
{
struct my_struct_t *my_name = container_of(work, struct my_struct_t, my_work);
printk(KERN_INFO “ my name is %s!\n”, my_name->name);
}

struct workqueue_struct *my_wq = create_workqueue(“my wq”);
struct my_struct_t my_name;

my_name.name = “Lion”;

INIT_WORK(&(my_name.my_work), my_func);
queue_work(my_wq, &(my_name.my_work));

destroy_workqueue(my_wq);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: