linux中條件變數和訊號量的區別!

老男孩IT教育機構發表於2023-03-03

  在Linux系統中,條件變數和訊號量是非常專業的詞彙,也是我們每個人都會接觸到的知識,那麼Linux中條件變數和訊號量有什麼區別?以下是具體內容介紹。

  條件變數

  條件變數使在多執行緒程式中用來實現“等待--->喚醒”邏輯常用的方法,是程式間同步的一種機制。條件變數用來阻塞一個執行緒,直到條件滿足被觸發為止,通常情況下條件變數和互斥量同時使用。

  一般條件變數有兩個狀態:

  ①一個/多個執行緒為等待"條件變數的條件成立"而掛起;

  ②另一個執行緒在"條件變數條件成立時"通知其他執行緒。

  訊號量

  訊號量是一種特殊的變數,訪問具有原子性。

  只允許對它進行兩個操作:

  ①等待訊號量:當訊號量值為0時,程式等待;當訊號量值大於0時,訊號量減1,程式繼續執行。

  ②傳送訊號量:將訊號量值加1。

  說明:Linux提供了一組訊號量API,宣告在標頭檔案sys/sem.h中。

  Linux條件變數和訊號量的區別:

  ①使用條件變數可以一次喚醒所有等待者,而這個訊號量沒有的功能,感覺是最*區別。

  ②訊號量始終有一個值,而條件變數是沒有的,沒有地方記錄喚醒過多少次,也沒有地方記錄喚醒執行緒過多少次。從實現上來說一個訊號量可以歐尼顧mutex+counter+condition variable實現的。因為訊號量有一個狀態,如果想精準的同步,那麼訊號量可能會有特殊的地方。訊號量可以解決條件變數中存在的喚醒丟失問題。

  ③訊號量的意圖在於程式間同步,互斥鎖和條件變數的意圖在於執行緒間同步,但是訊號量也可用於執行緒間,互斥鎖和條件變數也可用於程式間。應當根據實際的情況進行決定。訊號量最有用的場景是用以指明可用資源的數量。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952527/viewspace-2938077/,如需轉載,請註明出處,否則將追究法律責任。

相關文章