C++原子類實現

引言

在系統實現的過程當中,常常須要用到計數功能,爲了多線程下的安全使用,我本身定義了一個原子類。安全

基於Mutex的實現

我基於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下的原子鎖

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

相關文章
相關標籤/搜索