0

任何人都可以帮助我了解 Linux 内核中以下提到的 API 之间的区别:

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 创建工作队列。

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

4

2 回答 2

1

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

这两个函数实际上是宏:

#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_* 标志的详细信息,请参阅Documentation/workqueue.txt

该文件太大而无法完全引用,但它说:

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

于 2014-09-28T09:06:54.283 回答
-1
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);
    }
}
于 2016-08-25T13:14:17.693 回答