普通佇列
一、定義工作入口項
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...