前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++多线程编程课程

C++多线程编程课程

作者头像
范蠡
发布2020-10-23 11:30:12
1.1K0
发布2020-10-23 11:30:12
举报
文章被收录于专栏:高性能服务器开发

很多年以前的时候,技术面试的时候面试官经常会问“程序什么时候需要开启新的线程”这样的问题,那个时候多核 CPU 才刚开始普及,很多人也是才开始逐渐接触多线程技术。而如今多核 CPU 和多线程编程技术已经是下里巴人的技术了。

多线程程序虽然强大,但也让原来的程序执行流程变得复杂和具有一定的不确定性,比如带来资源的竞态问题,初学者或许意识不到带来的后果,往往不能够很好处理这个问题,帮助学习多线程编程的初中级读者,理清多线程程序的执行原理、脉络是我写专栏的创作初衷之一。

由于各种库和运行环境对操作系统多线程接口的封装,很多技术开发者做了很多年的开发,仍然只是个界面或者仅知道调用库的“业务”程序员,他们只能面向搜索引擎编程,遇到稍微复杂一点的多线程逻辑就不知如何下手了。

本专栏将从操作系统原理的角度介绍多线程技术的方方面面,从基础的知识到高级进阶,它们是笔者这些年工作的经验总结和踩坑之后的教训。

本专栏的内容主要分为以下三大方面。

1 操作系统层面上关于多线程和多线程协作的接口原理

无论是哪种编程语言和库,其最终都是要运行在操作系统上的,应用程序本身的特性应该是决定采用何种编程工具的最主要因素,但是无论你采用什么样的编程语言,通过了解操作系统 API 从而深入理解操作系统的工作原理,这本身就有很重要的意义。

操作系统是一个非常复杂的系统,在 API 之上加一层编程语言并不能消除其复杂性,最多不过是把复杂性隐藏起来而已。说不定什么时候,复杂的那一面迟早会蹦出来拖你的后腿,懂得系统 API 能让你可以更快地挣脱困境。

因此,针对多线程编程,本专栏将详细地介绍 Windows 和 Linux 操作系统层面上提供的各种多线程接口,理解并熟悉它们的使用后,读者在接触或者学习其他语言或者库提供的多线程功能时,可以快速地上手和掌握。

以协程这一技术为例,虽然协程是计算机操作系统原理之一,但是我们所接触的大多数操作系统并没有从系统层面上支持协程这一技术

而像 Golang 这一类语言是提供协程功能的,那这一类语言是如何支持的?如果你对操作系统的线程有着深入的了解,你也不难想明白:

线程是操作系统的内核对象,当多线程编程时,如果线程数过多,就会导致频繁地上下文切换,这些对性能是一种额外的损耗。

协程,是在应用层模拟的线程,它避免了上下文切换的额外损耗,同时又兼顾了多线程的优点,简化了高并发程序的复杂度。

再例如,线程局部存储技术是我们常用的一项多线程技术,它的存在让每个线程可以有自己私有存放数据的空间。那线程局部存储技术是如何实现的呢?本专栏中会庖丁解牛地介绍线程局部存储是什么以及它的实现原理。

2 基于操作系统多线程理论衍生出来的一些扩展理论模型和应用

正因为存在多线程编程,所以有了线程池模型,据我了解,“线程池”的实现和原理应该是多线程编程新手问的、聊的最多的一个技术点了。

本专栏会带领读者利用各种操作系统提供的线程同步对象来实现一个线程池,进而引出生产者消费者理论模型,再进一步升华,引出所谓的消息中间件,如 Kafka、RabbitMQ。

对于技术方案,我们不推崇重复造轮子,但是一定要具有重复造轮子的能力和了解轮子的制造原理。有了这项能力之后,在使用一些开源的消息中间件时,我们因为“知其然、知其所以然”才会把这些软件在项目中用得更好。

本专栏中会详细地介绍多线程操作整型变量非线程安全的原因以及解决方案。掌握了这些,你在学习像 Java 语言时,就明白了为什么 JDK 在操作一个整型变量时提供 AtomicInteger 这样的类了。

3 和多线程相关的,一些实际开发中的技巧和经验

如果你是一名开发者,那么曾经或许会为下面一些问题而头痛过,这些问题或许你在面试时被面试官问到或者在实际开发中遇到过:

  • 进程的 CPU 使用率过高如何查找原因并解决?
  • 如何让一个程序只允许使用者运行一个实例?
  • 在实际开发中,避免死锁有哪些可以遵循的规则?
  • 什么是条件变量的虚假唤醒?虚假唤醒会带来什么问题?如何解决?
  • 如何设计高效的线程池和队列模型?
  • 如何在线程函数中访问类的成员变量和函数?

诸如此类实际开发中经常遇到问题,实在太多了,这里就不一一列举了。本专栏在保持主干脉络介绍的同时,也会穿插介绍一些与多线程相关的开发技巧和经验。

当然,多线程问题本来就比较复杂,尤其是本专栏同时介绍 Windows 和 Linux 两个操作系统平台的接口,在实际编写程序时,由于操作系统提供的 API 不一样,为了跨平台,我们不得不写许多跨平台代码。好在,C++ 11/14 标准给 C++ 引入了大量的多线程类和库,本专栏也会详尽地介绍它们的用法。

以下是专栏的主要内容导图:

内容亮点:

  • 解析操作系统 API 层的多线程编程原理
  • 展示 Windows 和 Linux 操作系统的基本原理
  • 讲解线程间各种同步原语的适用场景、优缺点
  • 贯穿实际开发中的问题定位与排查

你将获得:

  • 彻底掌握多线程编程原理和编码经验
  • Windows 和 Linux 操作系统的基本原理
  • 线程之间各种同步原语的适用场景和优缺点
  • 相关编程惯用法和手段技巧
  • 了解 Java、Go 等上层语言运行时环境提供的功能是如何基于操作系统 API 实现的
  • 实际开发中一些问题定位与排查

由于操作系统调度线程时的不确定性,同样的逻辑可能在不同机器、不同时刻有不同的行为表现,也因此增加了排查和定位问题的难度。这是在学习和开发多线程程序时不得不面临的问题。

只要透彻地理解了这些操作系统提供的基础多线程同步原语,在面对它们的衍生物(如线程池、消息队列、协程技术等)时可以更快地学习和用好。

操作系统提供的 API 接口一般在相当长的时间内会保持不变的(至少保持向后兼容),一经学会,终生受用。在新技术新思想层出不穷、令人应接不暇时,掌握了操作系统层面的 API 和其设计思想原理,可以以不变应万变

最后,多线程编程在现代软件开发中是如此的重要,以至于熟练使用多线程编程是一名合格的后台开发人员的基本功,它是如此的重要,这个专栏能帮助你掌握它,愿它能让你彻底告别多线程编程烦恼。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 高性能服务器开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 操作系统层面上关于多线程和多线程协作的接口原理
  • 2 基于操作系统多线程理论衍生出来的一些扩展理论模型和应用
  • 3 和多线程相关的,一些实际开发中的技巧和经验
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档