首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux内核中的工作队列实现

Linux内核中的工作队列实现
EN

Stack Overflow用户
提问于 2014-09-28 07:34:47
回答 2查看 3.1K关注 0票数 0

有谁能帮助我理解Linux内核中下面提到的API之间的区别:

代码语言:javascript
复制
struct workqueue_struct *create_workqueue(const char *name); 
struct workqueue_struct *create_singlethread_workqueue(const char *name);

我编写了示例模块,当我尝试使用ps -aef查看它们时,它们都创建了一个工作队列,但我没有看到任何区别。

我提到过http://www.makelinux.net/ldd3/chp-7-sect-6,根据LDD3的说法:

如果您使用create_workqueue,,您将得到一个工作队列,它为系统上的每个处理器都提供了一个专用线程。在许多情况下,所有这些线程都是过头的;如果一个工作线程就足够了,那么使用create_singlethread_workqueue来创建工作队列。

但我无法看到多个工作线程(每个线程用于一个处理器)。

EN

回答 2

Stack Overflow用户

发布于 2014-09-28 09:06:54

自编写LDD3以来,工作队列发生了变化。

这两个函数实际上是宏:

代码语言:javascript
复制
#define create_workqueue(name)                                          \
        alloc_workqueue("%s", WQ_MEM_RECLAIM, 1, (name))
#define create_singlethread_workqueue(name)                             \
        alloc_workqueue("%s", WQ_UNBOUND | WQ_MEM_RECLAIM, 1, (name))

alloc_workqueue文档说:

使用指定的参数分配工作队列。有关WQ_*标志的详细信息,请参阅文档/工作队列.

这个文件太大了,不能完全引用,但它说:

alloc_workqueue()分配一个wq。原create_*workqueue()函数被取消,并计划删除。 ..。 wq不再管理执行资源,而是用作前向进度保证、刷新和工作项属性的域。

票数 1
EN

Stack Overflow用户

发布于 2016-08-25 13:14:17

代码语言:javascript
复制
if(singlethread){

    cwq = init_cpu_workqueue(wq, singlethread_cpu);
    err = create_workqueue_thread(cwq, singlethread_cpu);
    start_workqueue_thread(cwq, -1);

}else{

    list_add(&wq->list, &workqueues);
    for_each_possible_cpu(cpu) {    
                cwq = init_cpu_workqueue(wq, cpu);
                err = create_workqueue_thread(cwq, cpu);
                start_workqueue_thread(cwq, cpu);
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26082697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档