1. 程式人生 > 其它 >5.base之Atomic.h的實現

5.base之Atomic.h的實現

技術標籤:從輪子造起——一個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_;
};