linux中條件變數和訊號量的區別!
在Linux系統中,條件變數和訊號量是非常專業的詞彙,也是我們每個人都會接觸到的知識,那麼Linux中條件變數和訊號量有什麼區別?以下是具體內容介紹。
條件變數
條件變數使在多執行緒程式中用來實現“等待--->喚醒”邏輯常用的方法,是程式間同步的一種機制。條件變數用來阻塞一個執行緒,直到條件滿足被觸發為止,通常情況下條件變數和互斥量同時使用。
一般條件變數有兩個狀態:
①一個/多個執行緒為等待"條件變數的條件成立"而掛起;
②另一個執行緒在"條件變數條件成立時"通知其他執行緒。
訊號量
訊號量是一種特殊的變數,訪問具有原子性。
只允許對它進行兩個操作:
①等待訊號量:當訊號量值為0時,程式等待;當訊號量值大於0時,訊號量減1,程式繼續執行。
②傳送訊號量:將訊號量值加1。
說明:Linux提供了一組訊號量API,宣告在標頭檔案sys/sem.h中。
Linux條件變數和訊號量的區別:
①使用條件變數可以一次喚醒所有等待者,而這個訊號量沒有的功能,感覺是最*區別。
②訊號量始終有一個值,而條件變數是沒有的,沒有地方記錄喚醒過多少次,也沒有地方記錄喚醒執行緒過多少次。從實現上來說一個訊號量可以歐尼顧mutex+counter+condition variable實現的。因為訊號量有一個狀態,如果想精準的同步,那麼訊號量可能會有特殊的地方。訊號量可以解決條件變數中存在的喚醒丟失問題。
③訊號量的意圖在於程式間同步,互斥鎖和條件變數的意圖在於執行緒間同步,但是訊號量也可用於執行緒間,互斥鎖和條件變數也可用於程式間。應當根據實際的情況進行決定。訊號量最有用的場景是用以指明可用資源的數量。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952527/viewspace-2938077/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 附個人工作程式碼 條件變數深度運用、互斥鎖+訊號量變數
- SQL中on條件與where條件的區別[轉]SQL
- MySQL 變數和條件MySql變數
- C++中的條件變數C++變數
- 臨界區,互斥量,訊號量,事件的區別事件
- Jtti:linux下訊號量和互斥鎖有哪些區別?JttiLinux
- linux 條件變數詳解Linux變數
- 程式間通訊機制(管道、訊號、共享記憶體/訊號量/訊息佇列)、執行緒間通訊機制(互斥鎖、條件變數、posix匿名訊號量)記憶體佇列執行緒變數
- 互斥鎖和條件變數 (轉)變數
- linux 下的訊號量引數Linux
- shell中定義變數用雙引號和單引號以及不用引號的區別變數
- C++11 中的執行緒、鎖和條件變數C++執行緒變數
- Linux中訊號量的實現Linux
- Linux中的System V訊號量Linux
- Linux Qt使用POSIX多執行緒條件變數、互斥鎖(量)LinuxQT執行緒變數
- 成員變數和區域性變數的區別變數
- muduo網路庫學習筆記(4):互斥量和條件變數筆記變數
- Condition條件變數變數
- pthread 條件變數thread變數
- 關於條件變數變數
- Python中類變數、成員變數、區域性變數的區別Python變數
- Spark 外部變數和BroadCast變數的區別Spark變數AST
- 全域性變數和靜態變數的區別變數
- Bold訊號與fNIRS訊號的區別
- linux多執行緒-----同步機制(互斥量、讀寫鎖、條件變數)Linux執行緒變數
- linux多執行緒-----同步物件(互斥量、讀寫鎖、條件變數)的屬性Linux執行緒物件變數
- 使用channel代替條件變數變數
- 秒懂 Golang 中的 條件變數(sync.Cond)Golang變數
- Linux中“>”和“>>”的區別Linux
- 靜態變數和例項變數區別?變數
- Java基礎-成員變數和區域性變數的區別Java變數
- Oracle中單引號和雙引號的區別Oracle
- PHP中單引號和雙引號的區別PHP
- SQL Server解惑——查詢條件IN中能否使用變數SQLServer變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- sql 使用變數帶入in條件SQL變數
- 修改全域性變數時,可變型別和不可變型別的區別變數型別
- left join,right join,inner join的條件on和where的區別