您的位置:首页 > 运维架构 > Linux

Linux work queue 笔记(半原创)

2011-10-21 21:43 323 查看
R: 工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。这样,通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列允许被重新调度甚至是睡眠。

struct work_struct{

unsigned long pending; /* 这个工作正在等待处理吗?*/

struct list_head entry; /* 连接所有工作的链表 */

void (*func) (void *); /* 要执行的函数 */

void *data; /* 传递给函数的参数 */

void *wq_data; /* 内部使用 */

struct timer_list timer; /* 延迟的工作队列所用到的定时器 */

};

DECLARE_WORK(name, void (*func) (void *), void *data);

INIT_WORK(struct work_struct *work, woid(*func) (void *), void *data);

schedule_work(&work);

work马上就会被调度,一旦其所在的处理器上的工作者线程被唤醒,它就会被执行。

可以调度它在指定的时间执行:

schedule_delayed_work(&work, delay);

example:

#include <linux/module.h>

#include <linux/init.h>

#include <linux/workqueue.h>

static struct workqueue_struct *queue = NULL;

static struct work_struct work;

static void work_handler(struct work_struct *data)

{

printk(KERN_ALERT “work handler function.\n”);

}

static int __init test_init(void)

{

queue = create_singlethread_workqueue(“helloworld”); /*创建一个单线程的工作队列*/

if (!queue)

goto err;

INIT_WORK(&work, work_handler);

schedule_work(&work);

return 0;

err:

return -1;

}

static void __exit test_exit(void)

{

destroy_workqueue(queue);

}

MODULE_LICENSE(“GPL”);

module_init(test_init);

module_exit(test_exit);

推荐个文章:/article/2889978.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: