Muduo源码分析(2):原子类

来源:互联网 发布:在淘宝见过最污的东西 编辑:程序博客网 时间:2024/06/09 16:11
  • 原子性操作:
    不会被线程调度机制打断的操作,效率高于锁操作

  • Muduo封装的gcc原子操作函数:

// 如果*ptr == oldval,就将newval写入*ptr,然后返回*ptr// 否则直接返回*ptr__sync_val_compare_and_swap(type *ptr, type oldval type newval, ...)// 返回修改前的值__sync_fetch_and_add(type *ptr, type value, ...)        // 将*ptr设为value并返回*ptr操作之前的值。__sync_lock_test_and_set(type *ptr, type value, ...)

相对应的gcc>=4.7的版本中:
__atomic_load_n
__atomic_fetch_add
__atomic_store_n

template<typename T>class AtomicIntegerT : noncopyable{ public:  AtomicIntegerT(): value_(0){}  T get()  {  // 返回*value实际的值    return __sync_val_compare_and_swap(&value_, 0, 0);  T getAndAdd(T x)  {  // 1.获取*value的值;2.*value+x;3.返回*value原先的值    return __sync_fetch_and_add(&value_, x);  } T getAndSet(T newValue)  {  // 1.获取*value,2. *value=newValue 3. return *value原先的值    return __sync_lock_test_and_set(&value_, newValue);  }  T addAndGet(T x)  {  // 与getAndAdd(T x)相比,相当于返回*value+x后的值    return getAndAdd(x) + x;  }  T incrementAndGet()  {  // 相当于++i    return addAndGet(1);  }  T decrementAndGet()  {  // 相当于--i    return addAndGet(-1);  }  void add(T x)  {  // 相当于i++    getAndAdd(x);  }  void increment()  {    incrementAndGet();  }  void decrement()  {    decrementAndGet();  } private:  volatile T value_;};typedef AtomicIntegerT<int32_t> AtomicInt32;typedef AtomicIntegerT<int64_t> AtomicInt64;

变量value使用volatile修饰:
volatile修饰的变量,系统总是重新到改变量的内存重新读取数据,而不是去寄存器中读取该变量的备份数据,去除编译器对改该变量的优化处理。

原创粉丝点击