您当前的位置: 首页 >  c++

令狐掌门

暂无认证

  • 1浏览

    0关注

    513博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++11原子操作的应用与分析

令狐掌门 发布时间:2019-06-13 20:58:19 ,浏览量:1

       所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源。也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问。这有点类似互斥对象对共享资源的访问的保护,但是原子操作更加接近底层,因而效率更高。

​       在以往的C++标准中并没有对原子操作进行规定,我们往往是使用汇编语言,或者是借助第三方的线程库,例如intel的pthread来实现。在新标准C++11,引入了原子操作的概念,并通过这个新的头文件提供了多种原子操作数据类型,例如,atomic_bool,atomic_int等等,如果我们在多个线程中对这些类型的共享资源进行操作,编译器将保证这些操作都是原子性的,也就是说,确保任意时刻只有一个线程对这个资源进行访问,编译器将保证,多个线程访问这个共享资源的正确性。从而避免了锁的使用,提高了效率。

​       我们还是来看一个实际的例子。假若我们要设计一个广告点击统计程序,在服务器程序中,使用多个线程模拟多个用户对广告的点击。

       示例代码:

#include 
#include 
#include 

#pragma comment(lib, "libboost_thread-vc141-mt-gd-x32-1_70.lib")

using namespace std;

// 全局的结果数据 
long total = 0;


// 点击函数
void click()
{
	for (int i = 0; i < 1000000; ++i)
	{
		// 对全局数据进行无锁访问 
		total += 1;
	}
}


int main(int argc, char* argv[])
{
	// 计时开始
	clock_t start = clock();
	// 创建100个线程模拟点击统计
	boost::thread_group threads;
	for (int i = 0; i < 100; ++i)
	{
		threads.create_thread(click);
	}

	threads.join_all();
	// 计时结束
	clock_t finish = clock();
	// 输出结果
	cout             
关注
打赏
1652240117
查看更多评论
0.0489s