atomic是對整數 int 原子性操作的乙個封裝。使用了gcc原子性操作,效率比普通加鎖要高。這裡主要是使用了三個函式:
(1) 原子自增操作
將*ptr加上value,並返回*ptr原來的值
type __sync_fetch_and_add
(type *ptr, type value)
(2) 原子和比較操作
如果*ptr的值與oldval的值相等,則設定為newval,並返回oldval
type __sync_val_compare_and_swap
(type *ptr, type oldval type newval)
(3) 原子賦值操作
將*ptr設定為value並且返回*ptr原來的值
type __sync_lock_test_and_set
(type *ptr, type value)
#ifndef muduo_base_atomic_h
#define muduo_base_atomic_h
#include
"muduo/base/noncopyable.h"
#include
namespace muduo
// uncomment if you need copying and assignment
//// atomicintegert(const atomicintegert& that)
// : value_(that.get())
// {}
//// atomicintegert& operator=(const atomicintegert& that)
// //
t get()
t getandadd
(t x)
t addandget
(t x)
t incrementandget()
t decrementandget()
void
add(t x)
void
increment()
void
decrement()
t getandset
(t newvalue)
private
:volatile t value_;};
}// namespace detail
typedef detail::atomicintegert<
int32_t
> atomicint32;
typedef detail::atomicintegert<
int64_t
> atomicint64;
}// namespace muduo
#endif
// muduo_base_atomic_h
注意:getandadd() 返回的是舊值,addandget() 返回的是增加之後的值。
volate關鍵字的作用是:告訴編譯器不要優化**,每次都要從記憶體中讀取資料(防止讀取舊的快取)。
測試:
#include
#include
"atomic.h"
using
namespace std;
using
namespace muduo;
intmain()
輸出為:
num: get() 0
num: getandadd() 0
num: addandget() 2
muduo原始碼筆記 base Timestamp
timestamp表示的是utc時間,最小可表示微秒 us 資料成員microsecondssinceepoch 使用int64 t long long 表示物件,因此作者建議將此值按值傳遞,這樣可以直接存放在暫存器中,提高訪問速度。ifndef muduo base timestamp h def...
muduo原始碼筆記 base Mutex
mutexlock類是對互斥量的封裝,使用棧上物件mutexlockguard來管理mutex的加鎖與釋放。棧上物件在退出對應的 段之後會自動釋放,隨之,鎖也會被自動釋放。使用方法如下 class foo int foo size const mutex.h的部分原始碼如下所示 class capa...
讀Muduo原始碼筆記 1
物件銷毀時出現的競態條件 執行緒安全的類 簡單的執行緒安全類 class counter int value const int getandincrease private int value mutable mutexlock mutex int counter value const int ...