转载自:C++并发与多线程(1) | 并发、进程和线程的基本概念
在未来工作中,如果你需要进行大型的软件开发,就可能有许多的任务需要处理,如果将所有的任务都以串行的方式执行,则整个系统的效率将会非常低下,应用程序的用户体验会非常的差。
进程(英语:process),是指计算机中已运行的程序。进程是分时系统的基本运作单位。在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,进程是程序的基本执行实体;
通俗地说,进程——就是一个可执行程序运行起来了,就叫创建了一个进程。
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
线程的一些性质:
(1)每个进程都有一个主线程,这个主线程是唯一的,也就是一个进程中只能有一个主线程。
(2)当你执行一个可执行程序,产生了一个进程后,这个主线程就随着这个进程默默的启动起来了。
(3)运行这个程序时,实际上是进程中的主线程来执行(调用)这个main函数中的代码;
(4)主线程与进程共存。
两个或者更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立的任务;以往计算机,单核CPU(中央处理器):某一个时刻只能执行一个任务:由操作系统调度,每秒钟进行多次所谓的“任务切换”——并发的“假象”(不是真正的并发);这种切换(上下文切换)是要有时间开销的,比如操作系统要保存你切换时的各种状态、执行进度等问题,都需要时间,之后切换回来的时候要复原这些信息。
多线程就是一种并发。但是线程并不是越多越好,每个线程,都需要一个独立的堆栈空间(1M),线程之间的切换要保存很多中间状态;切换会耗费本该属于程序运行的时间。
(1)线程是用来执行代码的;
(2)把线程理解成一条代码的执行通路,一个新线程代表一条新的通路。
(3)一个进程自动包含一个主线程,主线程随着进程默默地启动并运行,我们可以通过编码来创建多个其他线程(非主线程);但是创建的数量最大都不建议超过200-300个,至于到底多少个合适,大家在实际的项目中可以不断调整和优化,有时线程太多的时候效率反而会降低。
(4)因为主线程是自动启动的,所以一个进程中最少也是有一个线程(主线程)。
(5)多线程程序可以同时做多个事,所以运行效率高。但是多高,并不是一个很容易评估和量化的东西。
(1)通过多个进程实现并发。
(2)在单独的进程中,创建多个线程来实现并发——自己写代码来创建除了主线程之外的其他线程。
进程之间通信:(同一个电脑上:管道,文件,消息队列(C++使用消息队列实现进程间通信),共享内存);
(不同电脑上:socket通信技术)
每个线程都有自己独立的运行路径,但是一个进程中的所有线程共享地址空间(共享内存)——全局变量、指针、引用都可以在线程之间传递,所以使用多线程开销远远小于多进程。
共享内存带来新问题,数据一致性问题:线程A,线程B,线程A操作B线程的数据,B也操作A的,那么会怎么样?——临界?互斥?
进程并发和多线程并发虽然可以混合使用,但是建议,优先考虑多线程技术。
与进程相比,线程有如下优点:
(1)线程启动速度更快,更轻量级;
(2)系统资源开销更少,执行速度更快,比如共享内存这种通信方式比任何其他的通信方式都快;
缺点:
(1)使用时有一定难度,要小心处理数据的共享问题。