linux併發控制之完成量

2021-06-25 21:32:16 字數 1808 閱讀 6721

完成量:表示乙個執行單元需要等待另乙個執行單元完成某事後方可執行。

1.它是一種輕量級機制,為了完成程序間的同步而設計

2.使用完成量等待時,呼叫程序是以獨佔睡眠方式進行等待的

3.不是忙等待

理解:定義於#include

其結構體為

struct completion ;

其中,done變數是完成量要保護的物件,wait則是申請完成量的程序等待佇列。

初始化函式

static inline void init_completion(struct completion *x)

done變數被初始化為0.

核心**中wait_for_common函式其實就是對done變數作判斷,若done變數沒有大於0,則它一直處於while迴圈中。

complete函式就是對done變數加1。wait_for_common函式便會退出while迴圈,同時將done減1,表示申請完成量成功。

操作:struct completion my_completion;    //定義完成量my_completion

init_completion(&my_completion);    //初始化完成量my_completion

void wait_for_completion(struct completion* comp)

該函式等待乙個完成量被喚醒。該函式會阻塞呼叫程序,如果所等待的完成量沒有被喚醒,那就一直阻塞下去,而且不會被訊號打斷;

int wait_for_completion_interruptible(struct completion* comp)

該函式等待乙個完成量被喚醒。但是它可以被外部訊號打斷;

int wait_for_completion_killable(struct completion* comp)

該函式等待乙個完成量被喚醒。但是它可以被kill訊號打斷;

unsigned long wait_for_completion_timeout(struct completion* comp, unsigned long timeout)

該函式等待乙個完成量被喚醒。該函式會阻塞呼叫程序,如果所等待的完成量沒有被喚醒,呼叫程序也不會一直阻塞下去,而是等待乙個指定的超時時間timeout,當超時時間到達時,如果所等待的完成量仍然沒有被喚醒,那就返回;超時時間timeout以系統的時鐘滴答次數jiffies計算

bool try_wait_for_completion(struct completion* comp)

該函式嘗試等待乙個完成量被喚醒。不管所等待的完成量是否被喚醒,該函式都會立即返回

bool completion_done(struct completion* comp)

該函式用於檢查是否有執行單元阻塞在完成量comp上(是否已經完成),返回0,表示有執行單元被完成量comp阻塞;相當於wait_for_completion_timeout()中的timeout=0

void complete(struct completion* comp)

該函式只喚醒乙個正在等待完成量comp的執行單元

void complete_all(struct completion* comp)

該函式喚醒所有正在等待同乙個完成量comp的執行單元

noret_type void complete_and_exit(struct completion* comp, long code)

該函式喚醒乙個正在等待完成量comp的執行單元,並退出,code為退出碼

注意:在核心處理完請求之後,必須呼叫這三個函式中的乙個,來喚醒其它正在等待的程序

第7章 Linux併發控制 完成量

7.8 完成量 linux提供了完成量 completion,完成量 完成量用於乙個執行單元等待另乙個執行單元執行完某事。linux中與完成量相關的操作主要有以下4種。include 1.定義完成量 定義名為my completion的完成量 struct completion my complet...

Linux核心中鎖機制之完成量 互斥量

下面討論完成量的內容,首先需明確完成量表示為乙個執行單元需要等待另乙個執行單元完成某事後方可執行,它是一種輕量級機制。事實上,它即是為了完成程序間的同步而設計的,故而僅僅提供了代替同步訊號量的一種解決方法,初值被初始化為0。它在include linux completion.h定義。如圖8.1所示...

第7章 Linux併發控制 訊號量

7.6 訊號量 訊號量 semaphore 是作業系統中最典型的用於同步和互斥的手段,訊號量的值可以是0 1或者n。訊號量與作業系統中的經典概念pv操作對應。p s 將訊號量s的值減1,即s s 1 如果s 0,則該程序繼續執行 否則該程序置為等待狀態,排入等待佇列。v s 將訊號量s的值加1,即s...