再次看到
condition,第一感覺還是覺得它和
mutex的功能是一樣的,沒必要存在。心裡這麼想,其實自己也知道怎麼可能多餘呢?老老實實的再分析一下**,這次一定要把理解出來的內容記下來!都怪平時寫**太少,用到
condition的情況更少,偶爾想用的時候又忘記怎麼用,於是就算了。
拿一段condition的使用**,反覆的揣摩對比。
voidprocess_msg(
void
)}
經過反覆的揣摩,我覺得
condition就像我們在除錯**的時候設定的某種斷點,它設計的意義在於兩個或者多個執行緒之間相互協調,相互配合,每個執行緒都要扮演乙個角色,或者是生產者,或者是消費者,不管是哪一種,至少是一種。
mutex雖然也是用於多執行緒間,但它設計的重點是保護自己的操作不被其它執行緒影響。如果想用它來實現生產者角色與消費者角色的區別,我只能說太難了,就算你想成為生產者,消費者也不一定給你機會,你得先搶到鎖才行,消費者明明沒有東西消費還要與生產者搶鎖,這樣子效率極其底下。
而在condition介入下情況比較好了,消費者發現沒有東西消費,迅速讓出鎖,並在
condition上阻塞,生產者可以迅速的獲取鎖(與消費者搶鎖的概率要底出很多,因為阻塞在
condition上的消費者執行緒不會再去搶鎖,除非它再次被叫醒)。
另外乙個問題,
condition為什麼需要
mutex呢?
condition從
pthread_cond_wait返回只能說明條件有變化,至於哪些有變化,有什麼變化,是否適合自己,
condition無法描述,也不需要它描述,因為我們無法把所有情況全部列舉出來。我們只能在具體的**中自己檢測。這個檢測的過程需要是乙個原子操作,
mutex的作用就是要保證條件檢測和部分必須操作的原子性。
pthread_cond_wait還有一點需要注意,它執行進去之後先檢查條件是否滿足,如果滿足繼續向下執行,否則釋放
mutex,阻塞在
condition上,等被叫醒的時候去搶
mutex,搶到進入保護**,執行完釋放
mutex。
執行緒同步工具Condition詳解
condition可以代替object監視器方法 wait notify和notifyall 必須和lock配合使用,lock替換synchronized方法和語句的使用,condition取代了物件監視器方法的使用。可以使某個執行緒掛起,直到其他執行緒喚醒,就像object.wait 方法,乙個c...
EAS工具類之KdTable工具類
public class basekdenutils for string columnkey columnkeys 獲取 寬度 param table param widtht寬度 param columnkeys public static void setcolumnkeyswidth kdt...
Android 工具類之 TextUtils
android開發中我們經常會使用一些自定義的工具類,比如字串工具類,時間工具類,日期工具類等等,其實android系統已經為我們建立了這些工具類,我們直接拿來用即可,若需要實現一些定製的工具方法,整合這些工具類,自定義實現定製方法即可。這裡我們來介紹一下android的字串工具類 textutil...