用例程解释create_singlethread_workqueue与create_workqueue的区别
什么是workqueue
Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程.
工作队列(workqueue)是另外一种将工作推后执行的形式.工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。最重要的就是工作队列允许被重新调度甚至是睡眠。
使用create_singlethread_workqueue创建工作队列即使对于多CPU系统,内核也只负责在一个cpu上创建一个worker_thread内核线程;而使用create_workqueue创建工作队列对于多CPU系统,内核将会在每个CPU上创建一个worker_thread内核线程,使得线程处理的事务能够并行化.
//工作以队列结构组织成工作队列(workqueue),其数据结构为workqueue_struct,
static struct workqueue_struct *test_wq = NULL;
//把推后执行的任务叫做工作(work),描述它的数据结构为work_struct
static struct work_struct work;
/创建工作队列workqueue_struct,该函数会为cpu创建内核线程/
test_wq = create_singlethread_workqueue("test_wq"); / test_wq = create_workqueue("test_wq");
/初始化工作work_struct,指定工作函数/
INIT_WORK(&work,work_func);
/将工作加入到工作队列中,最终唤醒内核线程/
queue_work(test_wq, &work);
共享工作队列
共享队列,就是系统创建了默认的workqueue,只需要定义初始化work,调用接口就完成。
两个接口:
bool schedule_work(struct work_struct *work);
bool schedule_delayed_work(struct delayed_work *dwork,
unsigned long delay);
网友评论