std::atomic和std::mutex区别

简介: 模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>。在多线程调用下,利用std::atomic可实现数据结构的无锁设计。

std::atomic介绍


模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>。在多线程调用下,利用std::atomic可实现数据结构的无锁设计。


和互斥量的不同之处在于,std::atomic原子操作,主要是保护一个变量,互斥量的保护范围更大,可以一段代码或一个变量。std::atomic确保任意时刻只有一个线程对这个资源进行访问,避免了锁的使用,提高了效率。


原子类型和内置类型对照表如下:

16e7af4bea8e4bcdb56492291b40203d.png

以下以两个简单的例子,比较std::mutex和std::atomic执行效率


atomic和mutex性能比较


使用std::mutex

#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <mutex>
#include <thread>
#include<future>
std::mutex mtx;
int cnt = 0; 
void mythread()
{
  for (int i = 0; i < 1000000; i++)
  {
    std::unique_lock<std::mutex> lock(mtx);
    cnt++;
  }
}
int main()
{
  clock_t start_time = clock();
  std::thread t1(mythread);
  std::thread t2(mythread);
  t1.join();
  t2.join();
  clock_t cost_time = clock() - start_time;
  std::cout << "cnt= " << cnt << " 耗时:" << cost_time << "ms" << std::endl;
  return 0;
}

执行结果:

9dce752ed039066090c8489ff00349c8.png

使用std::atomic

#include <iostream>
#include <ctime>
#include <thread>
#include<future>
std::atomic<int> cnt(0);
void mythread()
{
  for (int i = 0; i < 1000000; i++)
  {
    cnt++;
  }
}
int main()
{
  clock_t start_time = clock();
  std::thread t1(mythread);
  std::thread t2(mythread);
  t1.join();
  t2.join();
  clock_t cost_time = clock() - start_time;
  std::cout << "cnt= " << cnt << " 耗时:" << cost_time << "ms" << std::endl;
  return 0;
}

执行结果如下:

f68bf26d9b85df04ec69f6c9fa773109.png

总结


通过以上比较,可以看出来,使用std::atomic,耗时比std::mutex低非常多,使用 std::atomic 能大大的提高程序的运行效率。

相关文章
|
存储 C++
【C++杂货铺】探索string的底层实现
【C++杂货铺】探索string的底层实现
250 0
自定义QTableView右键弹出菜单, 并复制选中的单元格内容到剪贴板中
自定义QTableView右键弹出菜单, 并复制选中的单元格内容到剪贴板中
1230 0
|
网络协议 数据安全/隐私保护 Windows
当不在公司时,如何在外远程登录公司内网OA系统?
当不在公司时,如何在外远程登录公司内网OA系统?
744 0
|
敏捷开发 监控 数据可视化
关键链项目管理:全球化与本地化的完美结合
关键链项目管理(CCPM)由以色列物理学家艾利·高德拉特提出,基于“约束理论”,通过优化资源分配、引入缓冲管理和动态调整,显著提升项目效率和成功率。本文探讨了CCPM的国际化实践现状、应用优势及未来发展趋势,特别是在欧美、亚太及新兴市场的广泛应用。CCPM在缩短项目周期、提高资源利用率、降低风险和增强团队协作方面表现出色。未来,CCPM将与数字化工具深度融合,并在全球化与本地化结合中进一步普及,成为复杂项目管理的核心方法。
|
机器学习/深度学习 人工智能 自然语言处理
盘点2024年最先进的智能客服机器人TOP10 #SaaS产品#
综合市场数据和用户口碑为大家盘点10大主流服务商
960 4
|
编译器 Linux 开发者
.so文件如何反编译
【5月更文挑战第17天】.so文件如何反编译
1433 2
|
语音技术 C++
基于Qt的简易语音识别与合成系统设计与实现
基于Qt的简易语音识别与合成系统设计与实现
1055 0