14.十面埋伏的并发:多线程真的很难吗罗剑锋的C++实战笔记

article/2025/10/9 4:01:13

14.十面埋伏的并发:多线程真的很难吗

并发与多线程

并发有很多实现方式,而多线程只是其中最常用的手段

认识多线程

在C++中,线程就是一个能够独立运行的函数.你可以写一个lambda表达式让它在多线程中跑起来

  • auto f = // 定义一个lambda表达式
    {
    cout << "tid=" <<
    this_thread::get_id() << endl;
    };
    thread t(f); // 启动一个线程,运行函数f

好处:任务并行,避免IO阻塞,充分利用CPU,提高用户界面响应速度

基本常识:读而不写就不会有数据竞争

  • 读取const变量,对类调用const成员函数,
    对容器调用只读算法都是线程安全的

开发原则:最好的并发就是没有并发,最好的多线程就是没有线程

  • 在微观层面"看不到"线程,减少死锁,同步的恶性问题出现

多线程开发实践

基本工具:仅调用一次,线程局部存储,原子变量和线程对象

1.仅调用一次

2.线程局部存储

  • 读写全局(或局部静态)变量是常见的数据竞争场景

  • 有时候全局变量并不一定是必须共享的,
    可能是为了方便线程传入传出数据

    • 这种情况就是线程独占所有权,即线程局部存储
  • 有thread_local(和static,extern同级的关键字)标记的变量
    在每个线程里都会有一个独立的副本,是线程独占的

    • thread_local int n = 0;
      auto f2 = [&](int x) {
      cout << n << endl; //0
      n += x;
      cout << n << endl; //10 或者 100
      };
      thread t3(f2, 10);
      thread t4(f2, 100);
      t3.join();
      t4.join();
      cout << n << endl; //此处的n是主线程中的n,因此仍然是0.
    • 而如果把例子中的thread_local改为static,
      则变成所有的线程共享了

3.原子变量

  • 原子指在线程领域中不可分,操作要么完成,要么未完成.
  • 互斥量成本太高,对于小数据,原子化(atomic)是更好的方案
  • C++只能让一些基本的类型原子化,比如atomic_int,atomic_long等
  • 原子变量禁用了拷贝构造函数,因此初始化时不能用=,需要用()或{}
  • 最基本用法是作为线程安全的全局计数器或者标志位;别的用法是实现无锁数据结构

4.线程对象

  • 上面三个工具,都不与线程直接相关,但可以用于多线程编程,消除显式使用线程

  • std::thread成员与方法

    • 变量

      • id
    • 观察器

      • get_id, joinable
    • 操作

      • join,detach,swap
  • std::this_thread方法:yield,get_id,sleep_for,sleep_until

async()

  • 异步运行一个任务,隐含动作是启动一个线程去执行

    • 不绝对保证立即启动,可在第一参数传递std::launch::async,立即启动现场
  • 隐蔽的"坑"

    • 不显式获取async()的返回值,就会同步阻塞值任务完成
    • std::async(task, ...); // 没有显式获取future,被同步阻塞
      auto f = std::async(task, ...); // 只有上一个任务完成后才能被执行

XMind - Trial Version


http://chatgpt.dhexx.cn/article/FQCfytLT.shtml

相关文章

转型架构师之路——郑天民

作者&#xff1a;郑天民&#xff0c;网名天涯兰&#xff0c;日本足利工业大学信息工程学硕士&#xff0c;10 年软件行业从业经验&#xff0c;在医疗、安防和电商行业都有涉猎&#xff0c;前后担任系统分析架构师、部门经理、技术总监等职务。目前就职于一家业界领先的移动医疗互…

阿里技术专家章剑锋:5G时代,大数据将在AI、 IOT领域迎来爆发!

点击“技术领导力”关注∆ 每天早上8:30推送 文 | 章剑锋 笔者从 2008 年开始工作到现在也有 11 个年头了&#xff0c;一路走来都在和数据打交道&#xff0c;做过大数据底层框架内核的开发&#xff08;Hadoop&#xff0c;Pig&#xff0c;Tez&#xff0c;Spark&#xff0c;Livy…

大咖分享 | 甘云锋:解码数据中台,打造数据价值与能力共享中心

导语 数字化浪潮正以一种大势所趋的姿态汹涌而来。面对如此澎湃之伟力&#xff0c;产业数字化的转型之路正面临哪些痛点&#xff0c;又迎来何种机遇&#xff1f;怎样构建可持续发展的技术构架体系以激活数据要素的潜能&#xff1f; 日前&#xff0c;数澜科技创始人、董事长甘…

【华人学者风采】高剑峰 微软研究院

【华人学者风采】高剑峰&#xff0c;微软研究院深度学习技术中心合伙人研究经理、IEEE Fellow。曾于 1999-2005 年在微软亚洲研究院自然语言处理组担任研究员。研究兴趣包括机器学习、自然语言处理、互联网搜索、广告预测、机器翻译等。目前的研究方向是将深度学习应用于文字和…

博士申请 | 香港科技大学(广州)梁宇轩老师招收全奖博士/硕士/博后/RA/实习生...

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 香港科技大学&#xff08;广州&#xff09; 香港科技大学是亚洲以至全球领先的研究学府之一…

李剑锋:意识科学就在身边

来源&#xff1a; 科技日报-中国科技网 近些年&#xff0c;生命科学家开始关注神奇的大脑&#xff0c;因此各国纷纷提出各自的脑计划;当前有一个更基础的、但极富争议性的领域却被大家忽视了&#xff0c;就是意识科学。事实脑计划的终点应该就是意识科学&#xff0c;但由于目前…

Talk预告 | 上海交通大学计算机系博士生李杰锋方浩树:多人场景,全身136关键点检测与跟踪框架AlphaPose技术讲解

本期为TechBeat人工智能社区第466期线上Talk&#xff01; 北京时间12月28日(周三)20:00&#xff0c;上海交通大学计算机系博士生——李杰锋&方浩树的Talk将准时在TechBeat人工智能社区开播&#xff01; 他们与大家分享的主题是: “多人场景&#xff0c;全身136关键点检测与…

【极客时间】HTTP 专栏课-罗剑锋

HTTP 专栏课-罗剑锋 &#x1f436; 趁毕业之前&#xff0c;系统把计算机知识补充一下。从计算机网络开始&#xff0c;后面会扩展到数据结构、算法设计、设计模式、数据库、软件工程、中间件相关内容。这次先根据罗老师课程补一把计算机网络吧&#xff01;&#xff01; 破冰篇之…

专访:平安科技首席架构师金新明和他的程序人生

【CSDN 编者按】从改革开放后提出金融电子化&#xff0c;到如今新一代技术与金融的融合创新&#xff0c;近半个世纪以来&#xff0c;国内外金融科技究竟如何发展&#xff1f;为了回答这个问题&#xff0c;我们请到了平安科技首席架构师金新明&#xff0c;通过对他经历丰富的技术…

李剑锋

李剑锋7827 哈哈&#xff01;&#xff01;国庆快快乐乐&#xff01;&#xff01;&#xff01;&#xff01;看我的白马&#xff01;lijianfeng2 lijianfeng2 ,lijianfeng2 转载于:https://blog.51cto.com/248835/44664

《罗剑锋的c++实战笔记》总结

一、概论 本节可以看清楚C复杂的本质&#xff0c;理解程序运行机制和面向对象编程思想。 1.重新认识C&#xff1a;生命周期和编程范式 &#xff08;1&#xff09;生命周期 一个C程序从诞生到消亡要经历的阶段&#xff1a; 在上图中的编译过程中&#xff0c;编译器还会根据…

《 罗剑锋的C++实战笔记 》

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 生命周期和编程范式秀出好的code style宏定义和条件编译属性和静态断言怎样才能写出一个“好”的类&#xff1f;const/volatile/mutable&#xff1a;常量/变量究竟是…

西门子CP243通信控件

分享一下我老师大神的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;还带黄段子&#xff01;希望你也加入到我们人工智能的队伍中来&#xff01;https://blog.csdn.net/jiangjunshow 该控件经过多年现场运用&#xff0c;功能完善可靠&#xff0c;可…

叶帆哥哥的第一个wince驱动——FakeGPS 驱动

早在两年前就开始做WINCE应用程序了&#xff0c;但是由于分工的原因&#xff0c;一直以来都没有机会深入了解WINCE 驱动层面的开发&#xff08;包含PB相关的系统定制&#xff09;。要不是前段时间马宁安排了FakeGPS开发工作&#xff0c;真不知道什么时候才能了解WINCE驱动开发。…

【阿里云IoT+YF3300】11.物联网多设备快速通信级联

我们见到的很多物联网设备&#xff0c;大都是“一跳”上网&#xff0c;所谓的“一跳”就是设备直接上网&#xff0c;内嵌物联网模块或者通过DTU直接上网。其实稍微复杂的物联网现场&#xff0c;往往网关下面连接若干物联网设备&#xff08;如下图&#xff09;&#xff0c;并且这…

脚本语言运用(VBScript)叶帆

脚本语言运用(VBScript) VBScript 使用 ActiveX(R)脚本与宿主应用程序对话。使用 ActiveX Script&#xff0c;浏览器和其他宿主应用程序不再需要每个脚本部件的特殊集成代码。ActiveX脚本使宿主可以编译 Script、获取和调用入口点及管理开发者可用的命名空间。通过 ActiveX Scr…

叶帆密码箱简介

************************************************************ 叶帆软件系列 **** 叶帆密码箱 **** …

史上最全wireshark使用教程,8万字整理总结,建议先收藏再耐心研读

目录 第 1 章 介绍... 1 1.1. 什么是Wireshark. 1 1.1.1. 主要应用... 1

【认识】wireshark使用教程

本文章&#xff0c;是简单粗暴学习Wireshark的抓包功能后&#xff0c;记录的一些笔记。 1 Wireshark简介及抓包原理及过程 1.1 简介 Wireshark是1个网络封包分析软件。网络封包分析软件的功能是截取网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。Wireshark使用…

超详细的 Wireshark 使用教程

一、wireshark是什么&#xff1f; wireshark是非常流行的网络封包分析软件&#xff0c;简称小鲨鱼&#xff0c;功能十分强大。可以截取各种网络封包&#xff0c;显示网络封包的详细信息。 wireshark是开源软件&#xff0c;可以放心使用。可以运行在Windows和Mac OS上。对应的…