在多线程环境下要计数,需要保证:计数变量的一致性和线程安全才能保证多线程环境下计数正确。
原子计数正是提供了此需求的功能,保证计数操作未执行完毕时绝不会被其他任何实务或事件打断,下面是原子计数器 for pthreads
缺点:使用锁的形式实现原子计数时锁的操作会比计数器的加减操作的消耗大很多,可以通过linux自带的性能检测工具perf命令查看哪些操作消耗多。
#ifndef __ATOMICCOUNTER_H__
#define __ATOMICCOUNTER_H__
#if defined(__linux__)
//CAtomicCounter.h for Pthreads
#include <pthread.h>
class CAtomicCounter
{
private:
class CGuard //pthread_mutex_t锁的守护者类CGuard
{
public:
CGuard(pthread_mutex_t & mutex):m_mutex(mutex)
{
pthread_mutex_lock(&m_mutex);
}
~CGuard()
{
pthread_mutex_unlock(&m_mutex);
}
private:
pthread_mutex_t m_mutex;
};
private:
CAtomicCounter(CAtomicCounter const&);//禁止拷贝构造
CAtomicCounter& operator=(CAtomicCounter const&);//禁止赋值构造
public:
/// 需要显示调用此构造函数,阻止使用编译器提供的默认构造函数
explicit CAtomicCounter(long n) : m_cnt(n)
{
pthread_mutex_init(&m_mutex,