​std::atomic介绍​

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

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

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

以下以两个简单的例子,比较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;
}

执行结果:

使用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;
}

执行结果如下:

总结

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

std::atomic和std::mutex区别相关推荐

  1. std::atomic、std::async深入研究

    1.从上节课的一个demo说起. #include <iostream> #include <future> #include <vector> #include ...

  2. C++11 并发指南六( atomic 类型详解二 std::atomic )

    C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)  一文介绍了 C++11 中最简单的原子类型 std::atomic_flag,但是 std::atomic_flag ...

  3. c++ 11 原子操作库 (std::atomic)(一)

    定义于头文件 <atomic> atomic 类模板及其针对布尔.整型和指针类型的特化 template< class T >    struct atomic; (1) (C ...

  4. 5.2.6 std::atomic<>主要类的模板

    5.2.6 std::atomic<>主要类的模板 主模板的存在,在除了标准原子类型之外,允许用户使用自定义类型创建一个原子变量.不 是任何自定义类型都可以使用std::atomic< ...

  5. Item 40: Use std::atomic for concurrency, volatile for special memory.

    Item 40: Use std::atomic for concurrency, volatile for special memory. 本 Item 探讨一下 atomic 类型和 volati ...

  6. std::unique_lock与std::lock_guard区别示例

    std::unique_lock也可以提供自动加锁.解锁功能,比std::lock_guard更加灵活. std::lock_guard std::lock_guard是RAII模板类的简单实现,功能 ...

  7. std::make_unique和 std::make_shared区别

    区别1:分配除的指针,前者是不能赋值,只能move,后者可以赋值 区别2:前者使用智能指针数组,后者不行(因为后者分配出来的指针具有单一性) #include #include class A { p ...

  8. C++11 并发指南六(atomic 类型详解三 std::atomic (续))

    C++11 并发指南六( <atomic> 类型详解二 std::atomic ) 介绍了基本的原子类型 std::atomic 的用法,本节我会给大家介绍C++11 标准库中的 std: ...

  9. 5.2.4 std::atomic:指针运算

    5.2.4 std::atomic:指针运算 原子指针类型,可以使用内置类型或自定义类型T,通过特化 std::atomic<T*> 进行定义,就 如同使用bool类型定义 std::at ...

最新文章

  1. 鸿蒙就是安卓换皮_被喷换皮安卓?华为手机鸿蒙OS Beta版今日上线
  2. Apache IoTDB v0.13 发布!
  3. 全栈工程师之路(二)—— JavaScript(网页前端脚本语言)
  4. require(),include(),require_once()和include_once()的异同
  5. 精益软件过程中七大浪费的应对之道
  6. 2019腾讯广告算法大赛方案分享(冠军)
  7. 等保2.0丨2021 必须了解的40个问题
  8. TensorFlow2.0:数据统计
  9. 项目实施之预防注入漏洞
  10. 贝叶斯算法详解和拉普拉斯平滑
  11. 基于onnxruntime的YOLOv5单张图片检测实现
  12. 《SEM长尾搜索营销策略解密》一一2.12 宝洁里的长尾与创新
  13. mysql重复查询最后一条数据_sql查询表里重复记录现取重复最后一条记录方法
  14. js根据出生年月获取年龄
  15. 网络编程——实验一:基于TCPUDP的网络文件服务
  16. Arturia ARP 2600 V3 for Mac - 音响模拟合成工具
  17. 如何离线下载网易云音乐
  18. 无法用ip连接mysql数据库_MYSQL数据库无法使用IP访问的方法
  19. 【农历】计算方法--- (阳历转阴历)
  20. windows2008R2标准版在线升级至企业版

热门文章

  1. Android加载大图片不OutOfMemoryError
  2. python 重定向stdout_Python 犄角旮旯--重定向 stdout
  3. 总结计算机语言的基本元素,认识程序设计中基本元素教案.doc
  4. [转载] Python入门(输入/输出、数据类型、条件/循环语句)
  5. 数据库如何处理数据库太大_网络数据库中的数据处理
  6. 解压android img文件怎么打开,解压压缩android img文件
  7. 8051 管脚定义_8051微控制器的引脚说明
  8. Java ByteArrayInputStream skip()方法与示例
  9. Java ObjectInputStream readShort()方法(带示例)
  10. java 根据类名示例化类_Java LocalDateTime类| AdjustInto()方法与示例