多執行緒程式中為了防止執行緒併發造成的競態,需要經常使用到mutex進行資料保護。posix提供了phtread_mutex_t進行互斥保護資料。mutex的使用需要初始化和釋放對應(phtread_mutex_init() 和 phtread_mutex_destroy() 對應),上鎖和解鎖對應(phtread_mutex_lock 和 pthread_mutex_unlock對應)。lock和unlock的過程是設計邏輯的一部分一般都程式設計師都能正確的進行加鎖和解鎖對應,但是要防止lock之後程式出現異常或者提前return而沒有unlock。初始化mutex之後不釋放也會造成資源洩漏,也是很容易遺漏的地方。在實際開發中一般都需要自己封裝一下mutex。
class mutexlock
~mutexlock()
bool islockedbythisthread() const
void assertlocked() const
void lock()
void unlock()
pthread_mutex_t* getpthreadmutex()
private:
mutexlock(const mutexlock &);
mutexlock &operator=(const mutexlock &);
void unassignholder()
void assignholder()
pthread_mutex_t mutex_;
pid_t holder_;
};class mutexlockguard
~mutexlockguard()
private:
mutexlockguard(const mutexlockguard &);
mutexlockguard &operator=(const mutexlockguard &);
mutexlock& mutex_;
};
為了提高mutextlock的易用性,增加了乙個mutexlockguard 類來封裝mutextlock,實際使用的時候直接使用mutexlockguard,這樣就能防止忘記釋放mutex的情況出現(mutexlockguard 超出作用域(一般是乙個棧上變數)就會自動釋放,呼叫析構函式,destroy掉mutex)。
以上封裝其實就是所謂的raii的乙個具體實踐,c++中的智慧型指標shared_ptr,weak_ptr,unique_ptr 也是raii的優秀實現。
注:其實在c++11 執行緒庫中已經有lock guard可以直接使用了(std::lock_guard ,只需要include),不需要自己再寫一遍,對於沒有遷移到c++11上的專案可以使用自己封裝的mutex來提高易用性。
C 封裝互斥量和條件變數
1 互斥量是保護臨界區的另一種方法,當執行執行緒在臨界區的執行時間很長時,那麼就最好使用互斥量了,否則會造成其他的執行緒將會在臨界區外忙等,浪費cpu時間 此時其他執行緒發現臨界區已經被互斥量鎖住,那麼它們將會阻塞 當互斥量被釋放時,有多個執行緒在阻塞,多個執行緒均會被喚醒,但是只有乙個執行緒可以獲...
C 封裝POSIX 執行緒庫(一)互斥鎖的封裝
在知乎上有人吐槽說c 11多執行緒庫做的太複雜,建議自己封裝一蛤,只要乙個下午就搞定了。當然我沒有陳碩老師那麼大本事,花了幾天時間,學習了一下把posix pthread進行簡單的封裝。互斥鎖主要用於互斥,互斥是一種競爭關係,用來保護臨界資源一次只被乙個執行緒訪問。posix pthread提供下面...
C 物件導向封裝
一 什麼叫做物件導向封裝?封裝的概念 隱藏物件的屬性和實現細節,僅對外公開介面,控制在程式中屬性的讀取和修改的訪問級別。二 物件導向封裝有什麼好處 為什麼要封裝 封裝的目的 是增強安全性和簡化程式設計,使用者不必了解具體的實現細節,而只是要通過外部介面,以特定的訪問許可權來使用類的成員。三 如何使用...