您的位置:首页 > 其它

全局序列号的一种生成方法

2014-01-16 16:59 676 查看
#ifndef BASE_ATOMIC_SEQUENCE_NUM_H_

#define BASE_ATOMIC_SEQUENCE_NUM_H_

#include "base/atomicops.h"

#include "base/basictypes.h"

namespace base

{

class AtomicSequenceNumber;

// Static (POD) AtomicSequenceNumber that MUST be used in global scope (or

// non-function scope) ONLY. This implementation does not generate any static

// initializer.  Note that it does not implement any constructor which means

// that its fields are not initialized except when it is stored in the global

// data section (.data in ELF). If you want to allocate an atomic sequence

// number on the stack (or heap), please use the AtomicSequenceNumber class

// declared below.

class StaticAtomicSequenceNumber

{

 public:

  

  inline int GetNext()

  {

    return static_cast<int>(

        base::subtle::NoBarrier_AtomicIncrement(&seq_, 1) - 1);

  }

 private:

  

  friend class AtomicSequenceNumber;

  inline void Reset()

  {

    base::subtle::Release_Store(&seq_, 0);

  }

  base::subtle::Atomic32 seq_;

 

};

// AtomicSequenceNumber that can be stored and used safely (i.e. its fields are

// always initialized as opposed to StaticAtomicSequenceNumber declared above).

// Please use StaticAtomicSequenceNumber if you want to declare an atomic

// sequence number in the global scope.

class AtomicSequenceNumber

{

 public:

  

  AtomicSequenceNumber()

  {

    seq_.Reset();

  }

  inline int GetNext()

  {

    return seq_.GetNext();

  }

 private:

  

  StaticAtomicSequenceNumber seq_;

 

  DISALLOW_COPY_AND_ASSIGN(AtomicSequenceNumber);

};

}  // namespace base

#endif  // BASE_ATOMIC_SEQUENCE_NUM_H_
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: