工作隊列與Tasklet相同點和不同點:
1、相同
工作隊列與Tasklet都允許內核代碼請求某個函數在將來的時間被調用
2、區別
(1)、tasklet運行在中斷上下文,因此所有的tasklet代碼都必須是原子的。而工作隊列函數運行在一個特殊的內核進程上下文, 因此它們具有更好的靈活性。工作隊列可以休眠。
(2)、Tasklet始終運行在被初始提交的同一處理器上,但這只是工作隊列的默認方式。
(3)、內核代碼可以請求工作隊列函數的執行延遲給定的時間間隔
內核中使用struct workqueue_struct 來描述工作隊列
struct workqueue_struct *create_workqueue(const char *name)
struct workqueue_struct *create_singlethread_workqueue(const char *name)
要向一個工作隊列提交一個任務,需要填充一個work_struct結構,
宏編譯時:
DECLARE_WORK(name, void(*func)(void *), void *data)
運行時:
INIT_WORK(struct work_struct *work, void(*func)(void *), void *data)
PREPARE_WORK(struct work_struct *work, void(*func)(void *), void *data )
int queue_work(struct workqueue_struct*queue, struct work_struct *work)
int queue_delayed_work(struct workqueue_struct*queue, struct work_struct *work, unsighed long delay)
int cancel_delayed_work(struct work_struct *work)
void flush_workqueue(struct workqueue_struct *queue)
void destroy_workqueue(struct workqueue_struct *queue)