现代C++实战30讲
吴咏炜
前 Intel 资深软件架构师
立即订阅
3995 人已学习
课程目录
已更新 33 讲 / 共 33 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | C++这么难,为什么我们还要用C++?
免费
课前必读 | 有关术语发音及环境要求
基础篇 (9讲)
01 | 堆、栈、RAII:C++里该如何管理资源?
02 | 自己动手,实现C++的智能指针
03 | 右值和移动究竟解决了什么问题?
04 | 容器汇编 I:比较简单的若干容器
05 | 容器汇编 II:需要函数对象的容器
06 | 异常:用还是不用,这是个问题
07 | 迭代器和好用的新for循环
08 | 易用性改进 I:自动类型推断和初始化
09 | 易用性改进 II:字面量、静态断言和成员函数说明符
提高篇 (11讲)
10 | 到底应不应该返回对象?
11 | Unicode:进入多文字支持的世界
12 | 编译期多态:泛型编程和模板入门
13 | 编译期能做些什么?一个完整的计算世界
14 | SFINAE:不是错误的替换失败是怎么回事?
15 | constexpr:一个常态的世界
16 | 函数对象和lambda:进入函数式编程
17 | 函数式编程:一种越来越流行的编程范式
18 | 应用可变模板和tuple的编译期技巧
19 | thread和future:领略异步中的未来
20 | 内存模型和atomic:理解并发的复杂性
实战篇 (7讲)
21 | 工具漫谈:编译、格式化、代码检查、排错各显身手
22 | 处理数据类型变化和错误:optional、variant、expected和Herbception
23 | 数字计算:介绍线性代数和数值计算库
24 | Boost:你需要的“瑞士军刀”
25 | 两个单元测试库:C++里如何进行单元测试?
26 | Easylogging++和spdlog:两个好用的日志库
27 | C++ REST SDK:使用现代C++开发网络应用
新年特别策划 (2讲)
新春寄语 | 35年码龄程序员:人生漫长,走点弯路在所难免
新春福利 | C++好书荐读
未来篇 (2讲)
28 | Concepts:如何对模板进行约束?
29 | Ranges:无迭代器的迭代和更方便的组合
现代C++实战30讲
登录|注册

19 | thread和future:领略异步中的未来

吴咏炜 2020-01-08
你好,我是吴咏炜。
编译期的烧脑我们先告个段落,今天我们开始讲一个全新的话题——并发(concurrency)。

为什么要使用并发编程?

在本世纪初之前,大部分开发人员不常需要关心并发编程;用到的时候,也多半只是在单处理器上执行一些后台任务而已。只有少数为昂贵的工作站或服务器进行开发的程序员,才会需要为并发性能而烦恼。原因无他,程序员们享受着摩尔定律带来的免费性能提升,而高速的 Intel 单 CPU 是性价比最高的系统架构,可到了 2003 年左右,大家骤然发现,“免费午餐”已经结束了 [1]。主频的提升停滞了:在 2001 年,Intel 已经有了主频 2.0 GHz 的 CPU,而 18 年后,我现在正在使用的电脑,主频也仍然只是 2.5 GHz,虽然从单核变成了四核。服务器、台式机、笔记本、移动设备的处理器都转向了多核,计算要求则从单线程变成了多线程甚至异构——不仅要使用 CPU,还得使用 GPU。
如果你不熟悉进程和线程的话,我们就先来简单介绍一下它们的关系。我们编译完执行的 C++ 程序,那在操作系统看来就是一个进程了。而每个进程里可以有一个或多个线程:
每个进程有自己的独立地址空间,不与其他进程分享;一个进程里可以有多个线程,彼此共享同一个地址空间。
堆内存、文件、套接字等资源都归进程管理,同一个进程里的多个线程可以共享使用。每个进程占用的内存和其他资源,会在进程退出或被杀死时返回给操作系统。
并发应用开发可以用多进程或多线程的方式。多线程由于可以共享资源,效率较高;反之,多进程(默认)不共享地址空间和资源,开发较为麻烦,在需要共享数据时效率也较低。但多进程安全性较好,在某一个进程出问题时,其他进程一般不受影响;而在多线程的情况下,一个线程执行了非法操作会导致整个进程退出。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《现代C++实战30讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(6)

  • 李公子胜治
    作者大大,你好,我在effective modern c++这本书上面看到,作者告诫我们平时写代码时,首先基于任务而不是线程,但是如果我们使用async时,实际上async还是为我们创建了一个新线程,还是没有体会到async比thread的优越性,难道仅仅是可以调用get(),获取async后的执行结果吗?

    作者回复: 少写这么多代码,还没有优越性?

    新功能很多是用来提高程序员的工作效率的。而且,脑子摆脱了底层细节,就更有空去思考更高层的抽象了。否则开发里到处是羁绊,只看到这个不能做,那个很麻烦。

    2020-01-08
    4
  • YouCompleteMe
    当时看<The C++ Programming>下册关于多线程的时候,还写了一些demo,现在看到future/async这些类,一点想不起来怎么用的-_-

    作者回复: 一定是要多用,形成“肌肉记忆”才行。光读不用是真会忘的。

    2020-01-08
    3
  • 王大为
    最近用google的cpplint工具扫描了我的代码,但cpplint报告说不允许包含c++11的thread头文件,请问这个是出于什么目的呢?

    cpplint. py --verbose=5 my_cpp_file
    output : <thread> is an unapproved c++11 header

    我看了一下cpplint脚本,里面确实对mutex thread chrono等头文件做了限制。

    作者回复: 那是Google的偏好。除非你为Google的项目贡献代码,理它干嘛?

    2020-01-09
    1
    1
  • 三味
    普大喜奔!
    🍾🍾🎉🎉🎊🎊
    模板章节终于结束了!
    其实我还没学够呢(真心)

    其实死锁这玩意太容易出现了。描述一个比较经典的场景,A,B两个线程,a,b两个资源,两个线程都要用两个资源。
    A线程先用资源a,锁住资源a;
    B线程先用资源b,锁住资源b;
    A线程还需要资源b,但是不能放开资源a,因为没用完;
    B线程还需要资源a,但是也不能放开资源b,因为没用完;
    A线程占着a不放还想用b,B线程占着b不放还想用a;
    A说,你先给我用b,我用完b,我肯定ab一起放;
    B说,为啥你不给我用a,我用完a,我肯定ab一起放;
    任务管理器说:你们都死吧。

    作者回复: 编译期编程确实是 C++ 里比较好玩的部分,但也容易被滥用,还容易把新手全吓跑……

    2020-01-10
  • 舍得
    nice
    2020-01-08
  • tt
    烧脑的编译期内容终于结束了。每天在工作之余烧一会儿,还没烧透呢,就结束了。是该庆幸还是该解脱呢?

    感觉编译期编程就是C++中的理论物理,需要纸和笔,然后适应一大堆符号。

    feature只能使用一次,是为了避免多次使用带来的循环获取锁从而导致死锁么?


    读书的时候先学的就是C++,并且为其微妙的语义而着迷,可以工作中很少用到它。接触future, promise, async是从Python和JavaScript开始的。虽然这三种语言互补相同,可是在异步或者并发上,用的关键词竟然都是一样的,真是聪明的脑袋都是类似的,愚笨的脑袋各有不同啊。

    这个巧合也许因为Python和JavaScript底层都是用c/c++实现的?

    作者回复: future的设计原则我不熟。我是挺希望跟promise联用能复用,真当成管道。但目前不支持。也许以后可以。并发方面,C++的标准机制还缺不少东西的,同步只用标准库的话很难。不过C++20会加不少新东西。

    用词方面的相同应该和语言实现是否用C++没关系。并发方面有很多前沿的文献,标准术语应该早就有不少了吧。而且,标准的Python实现,CPython,是纯C写的。

    2020-01-08
收起评论
6
返回
顶部