在系统实现的过程当中,常常须要用到计数功能,为了多线程下的安全使用,我本身定义了一个原子类。安全
我基于Mutex实现了一个简单的原子类,代码以下多线程
/* * 说明:自定义整数操做的原子类,减小代码中的各类锁 */ #ifndef _ATOMIC_INT64_H_ #define _ATOMIC_INT64_H_ #include <stdint.h> #include "mutex.h" template<class T> class AtomicInt { public: AtomicInt(T value_) : value(value_){}; //自增加操做,返回增加前的值 void Increment(const T& step) { MutexGuard guard(mutex); value += step; } T GetValue() { MutexGuard guard(mutex); return value; } private: T value; Mutex mutex; }; #endif
如代码所示,这是一种最简单的原子类实现方式,基于系统提供的互斥量,实现对变量的互斥访问。并发
C++11自己提供了原子锁供咱们使用,很是方便,我写代码测试了一下,确实有效。 测试代码采用多线程分别对atomic int类型和普通的整数类型进行自增操做。结果发现 atomic int结果正确,而普通int类型数据不正确。测试
atomic_int32_t atomicintparam = 0; int32_t intparam = 0; void thread_atomic_test() { for (int i = 0; i < 10000; i++) { atomicintparam++; intparam++; } } void AtomicParamTest() { vector<thread*> threads; for (int i = 0; i < 10; i++) { std::thread* task = new std::thread(thread_atomic_test); threads.push_back(task); } for (thread* task : threads) { task->join(); } cout << "atomic int param: " << atomicintparam << endl; cout << "common int param: " << intparam << endl; }
结果以下:atom
atomic int param: 100000 common int param: 86996
目前的状况是咱们的编译器不支持C++11, 可是我以为基于Mutex实现一个原子锁又太重。为了解惑,我作了一个测试,在10个线程的并发下对某个整数进行自增操做,加到1亿。测试下来的时间以下,单位毫秒:线程
atomic int param: 100000000(自增次数) 2969 (时间) atomic int param: 100000000(自增次数) 13187(时间)
测试结果发现相差4倍左右,单线程加到1千万须要13s,个人场景里每一个计数器计数不超过100,用mutex,尚未成为个人瓶颈,可使用。code