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

相关文章
相关标签/搜索