17.1 C++并发与多线程-基础概念与实现
17.2 C++并发与多线程-线程启动、结束与创建线程写法
17.3 C++并发与多线程-线程传参详解、detach坑与成员函数作为线程函数
17.4 C++并发与多线程-创建多个线程、数据共享问题分析与案例代码
17.5 C++并发与多线程-互斥量的概念、用法、死锁演示与解决详解
17.6 C++并发与多线程-unique_lock详解
17.7 C++并发与多线程-单例设计模式共享数据分析、解决与call_once
17.8 C++并发与多线程-condition_variable、wait、notify_one与notify_all
17.9 C++并发与多线程-async、future、packaged_task与promise
17.10 C++并发与多线程-future其他成员函数、shared_future与atomic
17.11 C++并发与多线程-Windows临界区与其他各种mutex互斥量
17.12 C++并发与多线程-补充知识、线程池浅谈、数量谈与总结
文章目录
1.基础概念与实现
1.1 并发、进程、线程的基本概念和综述
(1)并发
并发表示两个或者更多任务(独立的活动)同时发生(进行)。例如,一面唱歌一面弹琴,一面走路一面说话,画画的时候听小说等。回归到计算机领域,所谓并发,就是一个程序同时执行多个独立的任务。
可以看到,使用并发的原因主要就是能够让多件事情同时做,从而提高整体做事情的效率,也就是提高整体的运行性能。
(2)可执行程序
可执行程序就是磁盘上的一个文件(也叫程序),如在Windows操作系统下,一个扩展名为.exe的程序一般就是一个可执行程序。而在Linux操作系统下,有可执行权限的文件如权限是-rwxrw-r–,这里的x表示的就是可执行权限,有这种权限的文件一般就是可执行程序。
(3)进程
进程就是运行起来了的可执行程序。
(4)线程
所以要把线程理解成一条代码的执行通路。
对线程做一个总结:
· 线程是用来执行代码的。
· 把线程理解成一条代码的执行通路(道路),一个新线程代表一条新的通路。
· 一个进程自动包含一个主线程,主线程随着进程默默启动并运行,并可以包含多个其他线程(非主线程,需要用代码来创建其他线程),但创建线程的数量最大一般都不建议超过200~300个,至于到底多少个合适,在实际项目中要不断调整和优化,有时候线程多了效率还会降低。
· 因为主线程是自动启动的,所以一个进程中最少也是有一个线程(主线程)的。所以读者可能会感觉,进程与线程有点像父亲和孩子的关系。
· 多线程程序可以同时做多件事,所以运行效率更高。但到底有多高,并不是一个很容易评估和量化的事情,仍旧需要在实际编程与实际项目中体会和调整。
(5)学习心得
很多人对于多线程开发觉得复杂、难用、不好控制。其实,多线程是一种非常强大的工具,能把多线程程序写好,写高效和稳定,不但是作为一个高级开发人员实力的体现,也是很多实际的项目必须采用的一种开发方式,因为只有这样,程序的运行效率才能满足实际生产环境的需要。
1.2 并发的实现方法
怎样实现并发呢?以下两种实现手段都可以:
· 通过多个进程来实现并发,每个进程做一件事。这里所说的进程,指的是这种只包含一个主线程的进程,这种手段并不需要在程序代码中书写任何与线程有关的代码。
· 在单独的一个进程中创建多个线程来实现并发,这种情况下就得书写代码来创建除主线程外的其他线程了(主线程不需要创建,进程一启动,主线程自动就存在并开始运行了)。
(1)多进程并发
看一看多进程并发。
(2)多线程并发
多线程就是在单个的进程中创建多个线程。
(3)总结
和多进程并发比较来讲,多线程并发的优缺点如下。
优点:线程启动速度更快,更轻量级;系统资源开销更少;执行速度更快。
缺点:使用起来有一定难度,要小心处理数据的一致性问题。
1.3 C++11新标准线程库
从C++11新标准开始,C++语言本身增加了针对多线程的支持。
在Windows下开发的C++多线程程序代码可以不用修改源代码,直接拿到同样支持C++11新标准的Linux平台的C++编译器上编译(这就是跨平台)。在实际的开发中,如果要求必须实现跨平台开发时,这会大量地减少开发人员的工作量,实在是很好。