linux內核工作隊列使用總結


  我總結出的內核工作隊列中的4種用法

1. 使用系統的工作隊列(不延遲)

  1)定義一個工作:

struct work_struct my_work;

  2)編寫一個函數:

void my_work_func (struct work_struct *p_work)
{
    printk("work func\n");
}

  3)將工作和函數綁定(一般在open函數里面執行)

INIT_WORK(&my_work, my_work_func);

  4)調度工作(實際上是加入到系統的工作隊列中)

schedule_work(&my_work);

2. 使用系統的工作隊列(延遲)

  1)定義一個延遲工作

struct delayed_work my_delayed_work;

  2)編寫一個函數

void my_work_func (struct work_struct *p_work)
{
    printk("work func\n");
}

  3)將延遲工作和函數綁定(一般在open函數里進行)

INIT_DELAYED_WORK(&my_delayed_work, my_work_func);

  4)調度工作(實際上是加入系統的工作隊列中)

schedule_delayed_work(&my_delayed_work, 2);
schedule_delayed_work函數傳入的第二個參數為系統的節拍數,一般系統默認為200Hz,因此2個節拍表示10ms,10ms之后再調用工作中的函數。

3. 使用自己的工作隊列(不延遲)

  1)定義一個自己的工作隊列指針

struct workqueue_struct *p_my_workqueue;

  2)創建一個工作隊列,並接收返回值,可以用create_singlethread_workqueue或者create_workqueue,這一步一般在open函數中實現。

p_my_workqueue = create_singlethread_workqueue("my_workqueue");
//p_my_workqueue = create_workqueue("my_workqueue");

  3)定義一個工作

struct work_struct my_work;

  4)編寫一個函數

void my_work_func (struct work_struct *p_work)
{
    printk("work func\n");
}

  5)將工作和函數綁定(一般在open函數里面執行)

INIT_WORK(&my_work, my_work_func);

  6)將工作插入工作隊列中便會調用工作中注冊的函數

queue_work(p_my_workqueue, &my_work);

  7)銷毀工作隊列

destroy_workqueue(p_my_workqueue);

 

4. 使用自己的工作隊列(延遲)

  1)定義一個自己的工作隊列指針

struct workqueue_struct *p_my_workqueue;

  2)創建一個工作隊列,並接收返回值,可以用create_singlethread_workqueue或者create_workqueue,這一步一般在open函數中實現。

p_my_workqueue = create_singlethread_workqueue("my_workqueue");
//p_my_workqueue = create_workqueue("my_workqueue");

  3)定義一個延遲工作

struct delayed_work my_delayed_work;

  4)編寫一個函數

void my_work_func (struct work_struct *p_work)
{
    printk("work func\n"); }

  5)將延遲工作和函數綁定(一般在open函數里進行)

INIT_DELAYED_WORK(&my_delayed_work, my_work_func);

  6)將工作插入工作隊列中,n個節拍之后便會調用工作中注冊的函數(n為queue_delayed_work函數中最后一個參數)

queue_delayed_work(p_my_workqueue, &my_delayed_work, 2);

  7)銷毀工作隊列

destroy_workqueue(p_my_workqueue);

 推薦文章:https://www.ibm.com/developerworks/cn/linux/l-cn-cncrrc-mngd-wkq/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM