物件銷毀時出現的競態條件:
執行緒安全的類:
簡單的執行緒安全類
class counter
int value() const;
int getandincrease();
private:
int value_;
mutable mutexlock mutex_;
};int counter::value() const
int counter::getandincrease()
每個物件都有自己的mutex_,因此不同物件之間不構成鎖爭用。
存在的問題:銷毀太難,析構函式呼叫的前提是成員變數mutex_被銷毀。無法保證析構的執行緒安全。
c++記憶體問題:
執行緒同步精要
執行緒同步四項原則
互斥器(mutex)使用原則:
鎖小結互斥鎖保護了乙個臨界區,在這個臨界區中,一次最多只能進入乙個執行緒。如果有多個程序在同乙個臨界區內活動,就有可能產生競態條件(race condition)導致錯誤。
讀寫鎖從廣義的邏輯上講,也可以認為是一種共享版的互斥鎖。如果對乙個臨界區大部分是讀操作而只有少量的寫操作,讀寫鎖在一定程度上能夠降低執行緒互斥產生的代價。
條件變數允許執行緒以一種無競爭的方式等待某個條件的發生。當該條件沒有發生時,執行緒會一直處於休眠狀態。當被其它執行緒通知條件已經發生時,執行緒才會被喚醒從而繼續向下執行。
可遞迴鎖與非遞迴鎖:二者唯一的區別是,同乙個執行緒可以多次獲取同乙個遞迴鎖,不會產生死鎖。而如果乙個執行緒多次獲取同乙個非遞迴鎖,則會產生死鎖。
mutexlock
mutex;
void
foo()
void
bar()
如果mutexlock鎖是個非遞迴鎖,則這個程式會立即死鎖。但是這並不意味著應該用遞迴鎖去代替非遞迴鎖。遞迴鎖用起來固然簡單,但往往會隱藏某些**問題。比如呼叫函式和被呼叫函式以為自己拿到了鎖,都在修改同乙個物件,這時就很容易出現問題。因此在能使用非遞迴鎖的情況下,應該盡量使用非遞迴鎖,因為死鎖相對來說,更容易通過除錯發現。程式設計如果有問題,應該暴露的越早越好。
muduo原始碼筆記 base Timestamp
timestamp表示的是utc時間,最小可表示微秒 us 資料成員microsecondssinceepoch 使用int64 t long long 表示物件,因此作者建議將此值按值傳遞,這樣可以直接存放在暫存器中,提高訪問速度。ifndef muduo base timestamp h def...
muduo原始碼筆記 base Atomic
atomic是對整數 int 原子性操作的乙個封裝。使用了gcc原子性操作,效率比普通加鎖要高。這裡主要是使用了三個函式 1 原子自增操作 將 ptr加上value,並返回 ptr原來的值 type sync fetch and add type ptr,type value 2 原子和比較操作 如...
muduo原始碼筆記 base Mutex
mutexlock類是對互斥量的封裝,使用棧上物件mutexlockguard來管理mutex的加鎖與釋放。棧上物件在退出對應的 段之後會自動釋放,隨之,鎖也會被自動釋放。使用方法如下 class foo int foo size const mutex.h的部分原始碼如下所示 class capa...