簡體   English   中英

一起使用wait_event_interruptible 和wake_up_all

[英]Using wait_event_interruptible and wake_up_all together

對於涉及使用阻塞和鎖調度進程的類項目,我們應該使用兩個內核函數:

int wait_event_interruptible(wait_queue_head_t q, CONDITION);
void wake_up_all(wait_queue_head_t *q); 

wait_event_interruptible 的解釋是:

在等待隊列中阻塞當前任務,直到 CONDITION 變為真。

這實際上是一個宏。 它重復評估CONDITION,它是一個C代碼片段,例如foo == bar或function() > 3。一旦條件為真,wait_event_interruptible返回0。如果條件為假,則將當前任務添加到wait_queue_head_t狀態為 TASK_INTERRUPTIBLE 的列表; 當前進程將阻塞,直到調用wake_up_all(&q),然后它會重新檢查CONDITION。 如果當前任務在 CONDITION 變為真之前接收到信號,則宏返回 -ERESTARTSYS。

而wake_up_all的解釋是:

通過將狀態設置為 TASK_RUNNABLE 來喚醒等待隊列中的所有任務。

我很難弄清楚這些函數究竟是如何工作的,以及如何一起使用它們。 例如,何時檢查 CONDITION? wait_event_interruptible 是連續輪詢,還是只在調用wake_up_all 時重新檢查條件? 這個解釋有點不清楚。

如果您能舉例說明如何一起使用這些功能,那將非常有幫助。

wait_event_interruptible 是連續輪詢,還是只在調用wake_up_all 時重新檢查條件? 這個解釋有點不清楚。

調度程序的全部意義在於避免在這種情況下進行輪詢。 您引用的內容中准確描述了發生的情況:僅在喚醒時重新檢查條件,例如,如果給定任務正在等待生成數據:

  • 消費者檢查數據是否可用

  • 如果不是(即條件為假),它將進入睡眠狀態並添加到等待隊列中

  • 醒來時重試

在制作人方面

  • 生成數據后,設置一些標志,或向列表中添加一些內容,以便消費者評估的條件變為真

  • 在waitqueue上調用wake_up或wake_up

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM