linux 核心之completion
如果核心中一個任務需要發出訊號通知另外一個任務發生了某個特定事件,使用完成量completion是兩個任得以同步的最簡單方法。當任務1需要執行某些工作時,需要等待任務2完成特定操作才能繼續執行,那麼任務1就會阻塞等待,當任務2的特定操作執行完成之後,通過completion通知任務1並喚醒,這時候任務1可以繼續執行。
標頭檔案<linux/completion.h>
①宣告一個completion
靜態宣告,不用初始化
DECLARE_COMPLETION(test_completion);
動態宣告,需要初始化
struct completion test_completion;
init_completion(&test_completion);
結構體:
struct completion
{
unsigned int done;
wait_queue_head_t wait;
}
其中的done是用來計數的,每呼叫一次complet(),這個值就會加1,呼叫一次wait_for_completion(),這個值就會減1,所以completion是使用計數的機制的。
②任務1等待事件的發生
調wait_for_completion(t&est__completion);
也可以使用等待超時的timeout函式。
③任務2呼叫complet喚醒等待的任務1
void complet(struct completion *comp)只能喚醒一個等待的程序,而void completion_all(struct completion *comp)喚醒等待該事件的所有程序,由於completion的實現機制是通過計數來實現的,所以complet在wait_for_completion之前呼叫也可以正常工作。