栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux工作队列-workqueue

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux工作队列-workqueue

Linux-workqueue讲解

1.workqueue是什么?

workqueue是对内核线程封装的,用于处理各种工作项的一种处理方法,由于处理对象是用链表拼接一个个工作项,依次取出来处理,然后从链表中删除,就像一个队列排好队依次处理一样,所以也称工作队列。
所谓封装可以简单理解一个中转站,一边指向"合适"的内核线程,一边接受你丢过来的工作项,用结构体workqueue_struct表示,而所谓的工作项也是个结构体–work_struct,里面有个成员指针,指向你最终要实现的函数。
workqueue_struct

struct workqueue_struct {
    struct list_head    pwqs;        
    struct list_head    list;        

    struct workqueue_attrs    *unbound_attrs;    
    struct pool_workqueue    *dfl_pwq;    

    char            name[WQ_NAME_LEN]; 

    unsigned int        flags ____cacheline_aligned; 
    struct pool_workqueue __percpu *cpu_pwqs; 
    struct pool_workqueue __rcu *numa_pwq_tbl[]; 
};

work_struct

struct work_struct
{
    atomic_long_t data;    //函数的参数
    struct list_head entry;    //挂到链表
    work_func_t func; //函数指针,指向你实现的函数功能
};
怎么使用?

简单示例1

#include 
#include 
#include 
#include 

struct workqueue_struct *workqueue_test;

struct work_struct work_test;

void work_test_func(struct work_struct *work)
{
    printk("%s()n", __func__);

    mdelay(1000);
    //再次添加并启用内核线程执行
    queue_work(workqueue_test, &work_test);
}


static int test_init(void)
{
    printk("Hello,world!n");

    
    workqueue_test = alloc_workqueue("workqueue_test", 0, 0);

    
    INIT_WORK(&work_test, work_test_func);

    
    queue_work(workqueue_test, &work_test);
    
    return 0;
}

static void test_exit(void)
{
    printk("Goodbye,cruel world!n");
    destroy_workqueue(workqueue_test);
}

module_init(test_init);
module_exit(test_exit);

MODULE_AUTHOR("Vedic ");
MODULE_LICENSE("Dual BSD/GPL");

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/740212.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号