Linux內核裏的等待隊列機制在做驅動開發時用的非常多,多用來實現阻塞式訪問,下面簡單總結了等待隊列的四種用法:
1. 睡眠等待某個條件發生(條件爲假時睡眠):
睡眠方式:wait_event, wait_event_interruptible
喚醒方式:wake_up (喚醒時要檢測條件是否爲真,如果還爲假則繼續睡眠,喚醒前一定要把條件變爲真)
2. 手工休眠方式一:
1) 建立並初始化一個等待隊列項 DEFINE_WAIT(my_wait) <==> wait_queue_t my_wait; init_wait(&my_wait); 2) 將等待隊列項添加到等待隊列頭中,並設置進程的狀態 prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state) 3 )調用schedule(),告訴內核調度別的進程運行 4) schedule返回,完成後續清理工作 finish_wait()
3. 手工休眠方式二:
1)建立並初始化一個等待隊列項:
DEFINE_WAIT(my_wait) <==> wait_queue_t my_wait; init_wait(&my_wait);
2)將等待隊列項添加到等待隊列頭中:
add_wait_queue
3)設置進程狀態
__set_current_status(TASK_INTERRUPTIBLE);
4)schedule()
5)將等待隊列項從等待隊列中移除
remove_wait_queue()
其實,這種休眠方式相當於把手工休眠方式一中的第二步prepare_to_wait拆成兩步做了,即prepare_to_wait <====>add_wait_queue + __set_current_status,其他都是一樣的。
4. 老版本的睡眠函數sleep_on(wait_queue_head_t *queue):
不推薦