我建议在您的代码中,维护递增的计数器。计数器可以是static
类成员或全局变量。如果您使用类来定义您的计数器,您可以让构造函数将您的计数器注册到单个存储库以及名称。然后,您可以通过查询存储库来查询和重置您的计数器。
struct Counter {
unsigned long c_;
unsigned long operator++ () { return ++c_; }
operator unsigned long () const { return c_; }
void reset () { unsigned long c = c_; ATOMIC_DECREMENT(c_, c); }
Counter (std::string name);
};
struct CounterAtomic : public Counter {
unsigned long operator++ () { return ATOMIC_INCREMENT(c_, 1); }
CounterAtomic (std::string name) : Counter(name) {}
};
ATOMIC_INCREMENT
将是一种特定于平台的机制,可以原子地增加计数器。__sync_add_and_fetch
GCC为此提供了一个内置的。ATOMIC_DECREMENT
类似,内置 GCC __sync_sub_and_fetch
。
struct CounterRepository {
typedef std::map<std::string, Counter *> MapType;
mutable Mutex lock_;
MapType map_;
void add (std::string n, Counter &c) {
ScopedLock<Mutex> sl(lock_);
if (map_.find(n) != map_.end()) throw n;
map_[n] = &c;
}
Counter & get (std::string n) const {
ScopedLock<Mutex> sl(lock_);
MapType::const_iterator i = map_.find(n);
if (i == map_.end()) throw n;
return *(i->second);
}
};
CounterRepository counterRepository;
Counter::Counter (std::string name) {
counterRepository.add(name, *this);
}
如果你知道同一个计数器会增加一个以上的线程,那么使用CounterAtomic
. 对于特定于线程的计数器,只需使用Counter
.