zoukankan      html  css  js  c++  java
  • 11. linux 驱动工作队列相关API

    不是所有的驱动程序都必须有自己的工作队列。驱动程序可以使用内核提供的缺省工作队列。由于这个工作队列由很多驱动程序共享,任务可能会需要比较长一段时间才能开始执行。为了解决这一问题,工作函数中的延迟应该保持最小或者不要延时。

    需要特别注意的是缺省队列对所有驱动程序来说都是可用的,但是只有经过GP许可的驱动程序可以用自定义的工作队列。

    • 创建工作队列

    每个工作队列有一个专门的线程,所有来自运行队列的任务在进程的上下文中运行(这样它们可以休眠)。驱动程序可以创建并使用它们自己的工作队列,或者使用内核的一个工作队列。

    //创建工作队列
    struct workqueue_struct *create_workqueue(const char *name);
    • 创建工作队列的任务

    工作队列任务可以在编译时或者运行时创建

    //编译是创建
    DECLARE_WORK(name, void (*function)(void *), void *data);
    //运行时创建
    INIT_WORK(struct work_struct *work, void (*function)(void *), void *data);
    • 将任务添加到工作队列中
    //添加到指定工作队列
    int queue_work(struct workqueue_struct *queue, struct work_struct *work);
            <br>
    int queue_delayed_work(struct workqueue_struct *queue, struct work_struct
            <br>
    *work, unsigned long delay);
    
    
    //添加到内核默认工作队列
    int schedule_work(struct work_struct *work);
    int schedule_delayed_work(struct work_struct *work, unsigned long delay);

    说明

    delay: 保证至少在经过一段给定的最小延迟时间以后,工作队列中的任务才可以真正执行。

    • 队列和任务的清除操作
    //取消任务
    int cancel_delayed_work(struct work_struct *work);
    
    
    //清空队列中的所有任务
    void flush_workqueue(struct workqueue_struct *queue);
    
    
    //销毁工作队列
    void destroy_workqueue(struct workqueue_struct *queue);
    
    
  • 相关阅读:
    [RxSwift教程]14、其他操作符:delay、materialize、timeout等
    [RxSwift教程]13、连接操作符:connect、publish、replay、multicast
    Java虚拟机类加载机制及双亲委派模式分析
    面试系列-如何设计一个类
    谈谈 MySQL 的 JSON 数据类型
    Java 多线程编程(2-异步中包含同步)
    还堵在高速路上吗?带你进入Scratch世界带你飞
    SQL Server SSIS相关介绍
    SQL Server开启READ_COMMITTED_SNAPSHOT
    SqlServer中select语句引起的死锁
  • 原文地址:https://www.cnblogs.com/standardzero/p/12551116.html
Copyright © 2011-2022 走看看