美文网首页
工作队列

工作队列

作者: 傀儡世界 | 来源:发表于2020-05-18 15:44 被阅读0次

    用例程解释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);

    相关文章

      网友评论

          本文标题:工作队列

          本文链接:https://www.haomeiwen.com/subject/jmvoghtx.html