5.base之Atomic.h的實現
阿新 • • 發佈:2021-01-07
技術標籤:從輪子造起——一個muduo庫的實現
AtomicIntegerT類
實現整型上的原子操作
類的介面
- 初始化值(建構函式):AtomicIntegerT()
- 返回當前值:get()
- 增加值並返回增加前的值:getAndAdd()
- 增加值並返回增加後的值:addAndGet()
- 遞增值並返回遞增前的值:incrementAndGet()
- 遞減值並返回遞減前的值:incrementAndGet()
- 增加值:add()
- 遞增值:increment()
- 遞減值:decrement()
- 設定並加鎖值,返回設定前的值:getAndSet()
###類的資料 - volatile T value_;(volatile用來防止常量優化)
底層支援
GCC內建原子操作
//比較*ptr與oldval的值,如果兩者相等,則將newval更新到*ptr並返回操作之前*ptr的值
type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)
// 將value加到*ptr上,結果更新到*ptr,並返回操作之前*ptr的值
type __sync_fetch_and_add (type *ptr, type value, ...)
// 將value寫入*ptr,對*ptr加鎖,並返回操作之前*ptr的值。即,try spinlock語義 type __sync_lock_test_and_set (type *ptr, type value, ...)
具體程式碼
template<typename T> class AtomicIntegerT : noncopyable { public: AtomicIntegerT() : value_(0) { } T get() { //返回當前值 __sync_val_compare_and_swap(&value_, 0, 0); } T getAndAdd(T x) { //增加值並返回增加前的值 return __sync_fetch_and_add(&value_, x); } T addAndGet(T x) { //呼叫了getAndAdd return getAndAdd(x) + x; } T incrementAndGet() { //呼叫了getAndAdd,引數為1 return getAndAdd(1); } T decrementAndGet() { //呼叫了getAndAdd,引數為-1 return getAndAdd(-1); } void add(T x) { //不返回 getAndAdd(x); } void increment() { //呼叫incrementAndGet incrementAndGet(); } void decrement() { //呼叫decrementAndGet decrementAndGet(); } T getAndSet(T newValue) { return __sync_lock_test_and_set(&value_, newValue); } private: voilatile T value_; };