在系統實現的過程當中,常常須要用到計數功能,爲了多線程下的安全使用,我本身定義了一個原子類。安全
我基於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