重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

C++11并发编程关于原子操作atomic的代码示例

一:概述

创新互联建站自2013年创立以来,公司自成立以来始终致力于为企业提供官网建设、移动互联网业务开发(微信小程序定制开发、手机网站建设、成都App定制开发等),并且包含互联网基础服务(域名、主机服务、企业邮箱、网络营销等)应用服务;以先进完善的建站体系及不断开拓创新的精神理念,帮助企业客户实现互联网业务,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致赞誉。

项目中经常用遇到多线程操作共享数据问题,常用的处理方式是对共享数据进行加锁,如果多线程操作共享变量也同样采用这种方式。

为什么要对共享变量加锁或使用原子操作?如两个线程操作同一变量过程中,一个线程执行过程中可能被内核临时挂起,这就是线程切换,当内核再次切换到该线程时,之前的数据可能已被修改,不能保证原子操作。

C++11提供了个原子的类和方法atomic,保证了多线程对变量原子性操作,相比加锁机制mutex.lock(),mutex.unlock(),性能有几倍的提升。

所需头文件

二:错误代码

//全局变量
int g_num = 0;
void fun()
{
  for (int i = 0; i < 10000000; i++)
  {
    g_num++;
  }
  return ;
}
int main()
{
  //创建线程1
  thread t1(fun);
  //创建线程2
  thread t2(fun);
  t1.join();
  t2.join();
  cout << g_num << endl;
  getchar();
  return 1;
}

应该输出结果20000000,实际每次结果都不一样,总是小于该值,正是由于多线程操作同一变量而没有保证原子性导致的。

三:加锁代码

//全局变量
int g_num = 0;
mutex m_mutex;
void fun()
{
  for (int i = 0; i < 10000000; i++)
  {
    m_mutex.lock();
    g_num++;
    m_mutex.unlock();
  }
  return ;
}
int main()
{
  //获取当前毫秒时间戳
  typedef chrono::time_point microClock_type;
  microClock_type tp1 = chrono::time_point_cast(chrono::system_clock::now());
  long long time1 = tp1.time_since_epoch().count();
  //创建线程
  thread t1(fun);
  thread t2(fun);
  t1.join();
  t2.join();
  cout << "总数:" << g_num << endl;
  //获取当前毫秒时间戳
  microClock_type tp2 = chrono::time_point_cast(chrono::system_clock::now());
  long long time2 = tp2.time_since_epoch().count();
  cout << "耗时:" << time2 - time1 << "ms" << endl;
  getchar();
  return 1;
}

执行结果:多次测试输出均为20000000,耗时在3.8s左右

C++11并发编程关于原子操作atomic的代码示例

四:atomic原子操作代码

//全局变量
atomic g_num = 0;
void fun()
{
  for (int i = 0; i < 10000000; i++)
  {
    g_num++;
  }
  return ;
}
int main()
{
  //获取当前毫秒时间戳
  typedef chrono::time_point microClock_type;
  microClock_type tp1 = chrono::time_point_cast(chrono::system_clock::now());
  long long time1 = tp1.time_since_epoch().count();
  //创建线程
  thread t1(fun);
  thread t2(fun);
  t1.join();
  t2.join();
  cout << "总数:" << g_num << endl;
  //获取当前毫秒时间戳
  microClock_type tp2 = chrono::time_point_cast(chrono::system_clock::now());
  long long time2 = tp2.time_since_epoch().count();
  cout << "耗时:" << time2 - time1 << "ms" << endl;
  getchar();
  return 1;
}

执行结果:多次测试输出均为20000000,耗时在1.3s左右

C++11并发编程关于原子操作atomic的代码示例

五:小结

c++11的原子类atomic相比使用加锁机制性能有2~3倍提升,对于共享变量能用原子类型的就不要再用加锁机制了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对创新互联的支持。如果你想了解更多相关内容请查看下面相关链接


文章名称:C++11并发编程关于原子操作atomic的代码示例
标题来源:http://cqcxhl.cn/article/piphpd.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP