mutexlock類是對互斥量的封裝,使用棧上物件mutexlockguard來管理mutex的加鎖與釋放。棧上物件在退出對應的**段之後會自動釋放,隨之,鎖也會被自動釋放。使用方法如下:
class
foo;
int foo::
size()
const
mutex.h的部分原始碼如下所示:
class
capability
("mutex"
) mutexlock : noncopyable
// 析構函式中銷毀mutex變數
~mutexlock()
// 判斷加鎖的物件是否是當前執行緒
bool
islockedbythisthread()
const
void
assertlocked()
const
assert_capability
(this
)// 加鎖
void
lock()
acquire()
// 釋放鎖
void
unlock()
release()
pthread_mutex_t*
getpthreadmutex()
/* non-const */
private
:friend
class
condition
;class
unassignguard
: noncopyable ~
unassignguard()
private
: mutexlock& owner_;};
void
unassignholder()
void
assignholder()
pthread_mutex_t mutex_;
// 互斥量
pid_t holder_;
// 持有鎖的執行緒id};
// 管理mutex加鎖與釋放的類(並不負責初始化與銷毀)
class
scoped_capability mutexlockguard : noncopyable
// 釋放物件是釋放鎖
~mutexlockguard()
release()
private
: mutexlock& mutex_;
};
condition類是對條件變數的封裝,使用到了mutexlock類
class
condition
: noncopyable
// 條件變數的銷毀
~condition()
// 如果為滿足條件,需要等待
// 首先將鎖的持有者設定為0
// 然後對等待條件變數
// 當等待結束時,會自動把鎖的持有者設定為當前現場
void
wait()
// returns true if time out, false otherwise.
bool
waitforseconds
(double seconds)
;// 喚醒等待條件的某個執行緒
void
notify()
// 喚醒等待條件的所有執行緒
void
notifyall()
private
: mutexlock& mutex_;
// 互斥量
pthread_cond_t pcond_;
// 條件變數};
// 等待 seconds 秒
bool muduo::condition::
waitforseconds
(double seconds)
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原始碼筆記 1
物件銷毀時出現的競態條件 執行緒安全的類 簡單的執行緒安全類 class counter int value const int getandincrease private int value mutable mutexlock mutex int counter value const int ...