C++并发与多线程(1) | 并发、进程和线程的基本概念

转载自:C++并发与多线程(1) | 并发、进程和线程的基本概念

在未来工作中,如果你需要进行大型的软件开发,就可能有许多的任务需要处理,如果将所有的任务都以串行的方式执行,则整个系统的效率将会非常低下,应用程序的用户体验会非常的差。

一、进程

进程(英语:process),是指计算机中已运行的程序。进程是分时系统的基本运作单位。在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,进程是程序的基本执行实体;

  通俗地说,进程——就是一个可执行程序运行起来了,就叫创建了一个进程。

一、线程

   线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

    线程的一些性质:

(1)每个进程都有一个主线程,这个主线程是唯一的,也就是一个进程中只能有一个主线程。

(2)当你执行一个可执行程序,产生了一个进程后,这个主线程就随着这个进程默默的启动起来了。

(3)运行这个程序时,实际上是进程中的主线程来执行(调用)这个main函数中的代码;

(4)主线程与进程共存。

三、并发

两个或者更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立的任务;以往计算机,单核CPU(中央处理器):某一个时刻只能执行一个任务:由操作系统调度,每秒钟进行多次所谓的“任务切换”——并发的“假象”(不是真正的并发);这种切换(上下文切换)是要有时间开销的,比如操作系统要保存你切换时的各种状态、执行进度等问题,都需要时间,之后切换回来的时候要复原这些信息。

多线程就是一种并发。但是线程并不是越多越好,每个线程,都需要一个独立的堆栈空间(1M),线程之间的切换要保存很多中间状态;切换会耗费本该属于程序运行的时间。

四、线程的总结

(1)线程是用来执行代码的;

(2)把线程理解成一条代码的执行通路,一个新线程代表一条新的通路。

(3)一个进程自动包含一个主线程,主线程随着进程默默地启动并运行,我们可以通过编码来创建多个其他线程(非主线程);但是创建的数量最大都不建议超过200-300个,至于到底多少个合适,大家在实际的项目中可以不断调整和优化,有时线程太多的时候效率反而会降低。

(4)因为主线程是自动启动的,所以一个进程中最少也是有一个线程(主线程)。

(5)多线程程序可以同时做多个事,所以运行效率高。但是多高,并不是一个很容易评估和量化的东西。

五、并发的实现方法

5.1 实现并发的手段

(1)通过多个进程实现并发。

(2)在单独的进程中,创建多个线程来实现并发——自己写代码来创建除了主线程之外的其他线程。

5.2 多进程并发

进程之间通信:(同一个电脑上:管道,文件,消息队列(C++使用消息队列实现进程间通信),共享内存);

(不同电脑上:socket通信技术)

5.3 多线程并发

 每个线程都有自己独立的运行路径,但是一个进程中的所有线程共享地址空间(共享内存)——全局变量、指针、引用都可以在线程之间传递,所以使用多线程开销远远小于多进程。

    共享内存带来新问题,数据一致性问题:线程A,线程B,线程A操作B线程的数据,B也操作A的,那么会怎么样?——临界?互斥?

 进程并发和多线程并发虽然可以混合使用,但是建议,优先考虑多线程技术。

5.4 两种并发方式对比

与进程相比,线程有如下优点:
    (1)线程启动速度更快,更轻量级;

    (2)系统资源开销更少,执行速度更快,比如共享内存这种通信方式比任何其他的通信方式都快;

缺点:
(1)使用时有一定难度,要小心处理数据的共享问题。

你可能感兴趣的:(C++,c++)