__sync_fetch_and_add测试demo

参考muduo库以及http://blog.csdn.net/ygm_linux/article/details/25823927

Atomic.h

#ifndef MUDUO_BASE_ATOMIC_H
#define MUDUO_BASE_ATOMIC_H


#include <boost/noncopyable.hpp>
#include <stdint.h>


namespace muduo{


namespace detail{


template<typename T>
class AtomicIntegerT : boost::noncopyable
{
public:
/*初始化时候value_=0*/
 AtomicIntegerT()
   : value_(0)
 {
 }


 // uncomment if you need copying and assignment
 //
 // AtomicIntegerT(const AtomicIntegerT& that)
 //   : value_(that.get())
 // {}
 //
 // AtomicIntegerT& operator=(const AtomicIntegerT& that)
 // {
 //   getAndSet(that.get());
 //   return *this;
 // }
 /*如果value_ == 0,就将参数三0写入value_, 
    返回操作之前的值
*/
 T get()
 {
   return __sync_val_compare_and_swap(&value_, 0, 0);
 }


/*先返回value_, 再让value_ = value_+x*/
 T getAndAdd(T x)
 {
   return __sync_fetch_and_add(&value_, x);
 }


/*返回value_+x, 再让value_ = value_+x */
 T addAndGet(T x)
 {
   return getAndAdd(x) + x;
 }


 /*返回value_+1, 再让value_ = value_+1 */
 T incrementAndGet()
 {
   return addAndGet(1);
 }


 /*返回value_-1, 再让value_ = value_-1 */
 T decrementAndGet()
 {
   return addAndGet(-1);
 }


  /*让value_ = value_+x*/
 void add(T x)
 {
   getAndAdd(x);
 }


 /*让value_ = value_+1*/
 void increment()
 {
   incrementAndGet();
 }
 
 /*让value_ = value_-1 */
 void decrement()
 {
   decrementAndGet();
 }


 /*将value_设为newValue并返回
    value_操作之前的值
*/
 T getAndSet(T newValue)
 {
   return __sync_lock_test_and_set(&value_, newValue);
 }


private:
 volatile T value_;
};
}


/*用AtomicInt32 和AtomicInt64 定义的对象有操作函数的*/
typedef detail::AtomicIntegerT<int32_t> AtomicInt32;
typedef detail::AtomicIntegerT<int64_t> AtomicInt64;
}


#endif  // MUDUO_BASE_ATOMIC_H


test.cpp

#include <assert.h>
#include "Atomic.h"


/*
assert的作用是:
参数为假时候先向stderr打印一条出错信息,
然后通过调用 abort 来终止程序运行.

*/
int main()
{
 {
 muduo::AtomicInt64 a0;
 /*如果value_ == 0,就将参数三0写入value_, 
   返回操作之前的值*/
 assert(a0.get() == 0);


  /*先返回value_, 再让value_ = value_+1;
  value_=1*/
 assert(a0.getAndAdd(1) == 0);


 /*如果value_ == 0,就将参数三0写入value_, 
   返回操作之前的值*/
 assert(a0.get() == 1);


 /*返回value_+x, 再让value_ = value_+x */
 assert(a0.addAndGet(2) == 3);
 assert(a0.get() == 3);


  /*返回value_+1, 再让value_ = value_+1 */
 assert(a0.incrementAndGet() == 4);
 assert(a0.get() == 4);


  /*让value_ = value_+1 */
 a0.increment();
 assert(a0.get() == 5);


  /*返回value_+x, 再让value_ = value_+x */
 assert(a0.addAndGet(-3) == 2);


  /*将value_设为100并返回
    value_操作之前的值*/
 assert(a0.getAndSet(100) == 2);
 assert(a0.get() == 100);
 }


 {
 muduo::AtomicInt32 a1;
 assert(a1.get() == 0);
 assert(a1.getAndAdd(1) == 0);
 assert(a1.get() == 1);
 assert(a1.addAndGet(2) == 3);
 assert(a1.get() == 3);
 assert(a1.incrementAndGet() == 4);
 assert(a1.get() == 4);
 a1.increment();
 assert(a1.get() == 5);
 assert(a1.addAndGet(-3) == 2);
 assert(a1.getAndSet(100) == 2);
 assert(a1.get() == 100);
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值