有时候使用 std::atomic 比使用 mutexes 更高效

问题分析:使用多线程更新一些简单数据时,比如 int 型,bool 型等等,可以使用 std::atomic,这比 mutex 来得更为高效。

比如,我们一般这样用:

int counter;
....
mu.lock();
counter++;
mu.unlock();

现在,我们可以这样用,

std::atomic<int> counter;
...
counter++;

概念

原子操作:可以把原子操作理解为一种不需要用到互斥量加锁(无锁)技术的多线程编程方式

互斥量:多线程编程中保护共享数据

使用场合

原子操作:针对的一般都是一个变量,而不是一个代码段

互斥量:加锁一般针对一个代码段(几行代码)

std::atomic 是个类模板,用来封装某个类型的值,如下

#include <thread>
#include <atomic>
#include <iostream> std::atomic<int> g_mycount; void mythread()
{
for (int i = 0; i < 10000000; i++)
{
g_mycount++;
}
return;
} int main()
{
std::thread myobj1(mythread);
std::thread myobj2(mythread);
myobj1.join();
myobj2.join();
std::cout << "两个线程执行完毕,最终的g_mycount的结果是: " << g_mycount << std::endl;
}

最后会打印出:两个线程执行完毕,最终的g_mycount的结果是: 20000000

如果不使用 std::atomic,即直接定义

int g_mycount = 0;

最后会打印出:两个线程执行完毕,最终的g_mycount的结果是: 10240079

注意:该结果是个随机值,因为两个线程读写值不受限制

另外,原子变量不可以这样定义,如下

auto atm_copy = atm; 

我们需要使用 .load(),以原子方式读取 atomic 对象的值

auto atm_copy = atm.load();

  

C++ 多线程的错误和如何避免(9)的更多相关文章

  1. c++多线程崩溃错误1

    主线程中的子线程没有jion,导致主线程马上结束,子线程对象被释放掉,而子线程还在后台继续执行导致崩溃 int main() OBJ = classA() OBJ.START()//在start函数中 ...

  2. Java SE之快速失败(Fast-Fail)与快速安全(Fast-Safe)的区别[集合与多线程/增强For](彻底详解)

    声明 特点:基于JDK源码进行分析. 研究费时费力,如需转载或摘要,请显著处注明出处,以尊重劳动研究成果:博客园 - https://www.cnblogs.com/johnnyzen/p/10547 ...

  3. Java多线程知识总结(一)

    一.创建线程的三种方式: 创建线程的方式有三种,一是创建Thread实例,二是实现Runnable接口,三是实现Callable接口,Runnable接口和Callable接口的区别是一个无返回值,一 ...

  4. Java回顾之多线程同步

    在这篇文章里,我们关注线程同步的话题.这是比多线程更复杂,稍不留意,我们就会“掉到坑里”,而且和单线程程序不同,多线程的错误是否每次都出现,也是不固定的,这给调试也带来了很大的挑战. 在这篇文章里,我 ...

  5. 2019年北航OO第二单元(多线程电梯任务)总结

    一.三次作业总结 1. 说在前面 对于这次的这三次电梯作业,我采用了和几乎所有人都不同的架构:将每个人当作一个线程.这样做有一定的好处:它使得整个问题的建模更加自然,并且在后期人员调度变得复杂时,可以 ...

  6. 转:最近5年133个Java面试问题列表

    最近5年133个Java面试问题列表 Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来 ...

  7. [转载]hashmap hashtable 的区别

    Hashtable 和 HashMap 做为 Map 的基本特性 两者都实现了Map接口,基本特性相同 -          对同一个Key,只会有一个对应的value值存在 -          如 ...

  8. Java笔试题解答和部分面试题

    面试类  银行类的问题 问题一:在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? HashMap本身没有什么问题,有没有问题取决于你是如何使用它的.比如,你 ...

  9. Java 集合系列 11 hashmap 和 hashtable 的区别

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  10. 面试题_76_to_81_Java 最佳实践的面试问题

    包含 Java 中各个部分的最佳实践,如集合,字符串,IO,多线程,错误和异常处理,设计模式等等. 76)Java 中,编写多线程程序的时候你会遵循哪些最佳实践?(答案)这是我在写Java 并发程序的 ...

随机推荐

  1. [转帖]umount -fl用法

    https://www.cnblogs.com/xingmuxin/p/8446178.html umount, 老是提示:device is busy, 服务又不能停止的.可以用"umou ...

  2. [转帖]【OS】OSWbb(OSWatcher Black Box)的简介和使用

    http://blog.itpub.net/26736162/viewspace-2142613/ OSWatcher Black Box, 简称OSW,是提供的一个小但是非常有用的工具,它通过调用O ...

  3. [转帖]vdbench - 性能压力测试工具

    <存储工具系列文章>主要介绍存储相关的测试和调试工具,包括不限于dd.fio.vdbench.iozone.iometer.cosbench等性能负载工具,及strace等调试工具. 1. ...

  4. [转帖]nacos开启强鉴权

    注意 Nacos是一个内部微服务组件,需要在可信的内部网络中运行,不可暴露在公网环境,防止带来安全风险. Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系. 如果 ...

  5. Systemd设置ulimit的方式与方法

    Systemd设置ulimit的方式与方法 摘要 Linux安装完成之后前面几件事情一般是处理selinux 以及处理ulimit 其实处理文件打开数有多种方法,之前也总结过, 但是最近因为syste ...

  6. CentOS firewall简单总结

    CentOS firewall简单总结 简介 防火墙是安全的重要道防线. 硬件防火墙一般部署再内网的边界区域.作为最外层的防护. 但是一般硬件的防火墙会比较宽松. 不然会导致很多业务不可用 软件防火墙 ...

  7. Nginx 按天拆分日志

    https://blog.csdn.net/linpxing1/article/details/104059857 ### 关键位置 start if ($time_iso8601 ~ '(\d{4} ...

  8. 【小实验】golang的if比较中的string/[]byte转换会被编译器优化

    之前做了实验,[]byte类型使用string()进行转换的时候,会产生拷贝.see: [小测试]golang中使用string()来转换[]byte数组产生了拷贝 不过今天又有了新的认识.请先看下面 ...

  9. vim 从嫌弃到依赖(17)——查找模式

    最开始介绍vim的时候,提到vim有普通模式.插入模式.可视模式和命令行模式,并且已经对这几个模式做了详细的介绍了.除了这几个模式以外,vim还有一个非常强大的模式--查找模式,为什么最开始没有将其列 ...

  10. 【构建docker镜像之插件篇】使用插件实战演示:docker-maven-plugin和jib-maven-plugin

    1.说明: docker容器化部署是非常流行的,Java应用如果要运行在docker环境,就要制作包含该应用的docker镜像,可以手动使用dockerfile和docker-compose制作镜像, ...