linux各種佇列

2021-06-07 22:34:29 字數 3443 閱讀 8902

普通佇列

一、定義工作入口項

struct workqueue_struct *suspend_work_queue;

二、建立單執行緒的工作佇列

suspend_work_queue = create_singlethread_workqueue("suspend");

if (suspend_work_queue == null)

三、宣告和初始化工作佇列入口項

static declare_work(suspend_work, suspend);//suspend_work是宣告的結構體名稱;suspend是函式

四、實現處理函式

static void suspend(struct work_struct *work)

五、將工作提交到工作佇列

queue_work(suspend_work_queue, &suspend_work);//需要使用佇列的時候,呼叫這個函式

六、不使用佇列時,釋放相關資源

destroy_workqueue(suspend_work_queue);//這個只在有建立佇列的時候使用,共享佇列不能和不必使用

延時佇列        

一、定義工作佇列和工作入口項

static struct workqueue_struct *mdp_pipe_ctrl_wq; /* mdp mdp pipe ctrl wq */        

static struct delayed_work mdp_pipe_ctrl_worker;

二、建立單執行緒的工作佇列

mdp_pipe_ctrl_wq = create_singlethread_workqueue("mdp_pipe_ctrl_wq");

三、宣告和初始化工作佇列入口項

init_delayed_work(&mdp_pipe_ctrl_worker, mdp_pipe_ctrl_workqueue_handler);

//mdp_pipe_ctrl_worker是要宣告的結構體名稱,mdp_pipe_ctrl_workqueue_handler 是處理函式

四、實現處理函式

static void mdp_pipe_ctrl_workqueue_handler(struct work_struct *work)//處理函式

五、將工作提交到工作佇列

queue_delayed_work(mdp_pipe_ctrl_wq, &mdp_pipe_ctrl_worker,mdp_timer_duration);//呼叫工作佇列

六、刪除佇列

/* cancel pipe ctrl worker */

cancel_delayed_work(&mdp_pipe_ctrl_worker);//返回值為0則說明該入口項已經在其他處理器上執行,因此在cancel_delayed_work返回後可能仍在執行

//為了保證cancel_delayed_work在返回0之後,工作函式都不會在系統的任何地方執行,在應隨後呼叫下面的函式

/* for workder can't be cancelled... */

flush_workqueue(mdp_pipe_ctrl_wq);

共享佇列

(共享佇列不應該長期獨佔改佇列,即不能長時間睡眠,而且我們的任務可能需要更長得時間才能獲得處理器)

一、定義工作入口項

static struct work_struct ssd2531_wq_updateevn;

二、宣告和初始化工作佇列入口項

init_work(&ssd2531_wq_updateevn, ssd2531_do_work_updateevn);

三、實現處理函式

static void ssd2531_do_work_updateevn(struct work_struct *work)

四、在需要的地方呼叫

schedule_work(&ssd2531_wq_updateevn);

共享延時佇列

(其中declare_work替代declare_delayed_work,schedule_work替代schedule_delayed_work就可以變為非延時佇列了)

一、宣告處理函式

static void jack_func(struct work_struct *work);

二、宣告和初始化工作佇列入口項

declare_delayed_work(jack_work,jack_func);   //declare_work(jack_work,jack_func);

三、在需要的地方呼叫

schedule_delayed_work(&jack_work,hz);        //schedule_work(&jack_work);

四、刪除佇列

cancel_delayed_work(&jack_work);             //cancel_work_sync(&jack_work);//注意:沒有cancel_work這個函式

初始化有兩種方法。

一種為靜態方法:

#define declare_work(n, f)                    \

struct work_struct n = __work_initializer(n, f)

#define __work_initializer(n, f) ,            \

.func = (f),                        \

__work_init_lockdep_map(#n, &(n))            \

}另一種為動態方法:

#define init_work(_work, _func)                        \

do while (0)

#endif

declare_work和init_work可以互替,但是使用init_work時一定要先定義work_struct結構體,如

static struct work_struct ssd2531_wq_updateevn;

init_work(&ssd2531_wq_updateevn, ssd2531_do_work_updateevn);

declare_work(ssd2531_wq_updateevn, ssd2531_do_work_updateevn);

同理,declare_delayed_work和init_delayed_work也可以互替

schedule_work和queue_work可以互替使用

create_workqueue 與 create_singlethread_workqueue 的區別

create_workqueue 核心會在系統中的每個處理器上為該工作佇列建立專用的執行緒,在許多情況下,眾多的執行緒可能會對效能具有某種程度的殺傷力,

因此如果單個工作執行緒足夠使用,那麼應該使用 create_singlethread_workqueue

linux訊息佇列 Linux訊息佇列

訊息佇列,unix的通訊機制之一,可以理解為是乙個存放訊息 資料 容器。將訊息寫入訊息佇列,然後再從訊息佇列中取訊息,一般來說是先進先出的順序。可以解決兩個程序的讀寫速度不同 處理資料速度不同 系統耦合等問題,而且訊息佇列裡的訊息哪怕程序崩潰了也不會消失。最簡單的訊息記憶體的使用流程 ftok函式生...

linux佇列 佇列 您是如何發現Linux的?

linux佇列 歡迎來到the queue,這是我將為opensource.com撰寫的新問答欄。儘管通常我會回答讀者的問題,但有時我會轉而詢問讀者問題。隨著linux的今天已經25歲了,我認為看看我們所有人如何發現作業系統將會很有趣。我開始 我最近問了乙個問題 您是如何發現linux的?在linu...

linux各種壓縮命令

這條命令是將所有.jpg的檔案打成乙個名為all.tar的包。c是表示產生新的包 f指定包的檔名。tar rf all.tar gif 這條命令是將所有.gif的檔案增加到all.tar的包裡面去。r是表示增加檔案的 意思。tar uf all.tar logo.gif 這條命令是更新原來tar包a...