进程、线程简介及多线程的优缺点

先介绍下进程、线程、多线程,再总结下多线程的优缺点:

一、进程

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,也就是应用程序的执行实例,进程是系统进行资源分配和调度的一个独立单位。每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。 

二、线程

线程是程序中的一个执行流,一个进程中可以包含多个线程,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。 

三、多线程

多线程是指程序中包含多个执行流,即在一个程序(进程)中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序(进程)创建多个并行执行的线程来完成各自的任务。在单核处理器的电脑中,线程协调程序在完成一个时间片之后迅速地在活动的线程之间进行切换执行。比如一个程序执行期间,你可以进行多个操作,其实就是线程间在飞快的切换,这叫做并发。在多核电脑中,多线程被实现成混合时间片和真实的并行,即不同的线程在不同的CPU上执行。 

1、多线程的优点 

  • 多线程处理可以同时运行多个线程。由于多线程应用程序将程序划分成多个独立的任务,因此可以在以下方面显著提高性能
  • 多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;
  • 当前没有进行处理的任务时可以将处理器时间让给其它任务;
  • 占用大量处理时间的任务可以定期将处理器时间让给其它任务;
  • 可以随时停止任务;
  • 可以分别设置各个任务的优先级以优化性能 

2、多线程的缺点

  • 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
  • 多线程需要协调和管理,所以需要CPU时间跟踪线程;
  • 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
  • 线程太多会导致控制太复杂,最终可能造成很多Bug; 

3、什么时候使用多线程

  • 耗时或大量占用处理器的任务阻塞用户界面操作;

  多线程程序一般被用来在后台执行耗时的任务。主线程保持运行,并且工作线程做它的后台工作。对于Windows Forms程序来说,如果主线程试图执行冗长的操作,键盘和鼠标的操作会变的迟钝,程序也会失去响应。由于这个原因,应该在工作线程中运行一个耗时任务时添加一个工作线程,即使在主线程上有一个有好的提示“处理中...”,以防止工作无法继续。这就避免了程序出现由操作系统提示的“没有相应”,来诱使用户强制结束程序的进程而导致错误。模式对话框还允许实现“取消”功能,允许继续接收事件,而实际的任务已被工作线程完成。BackgroundWorker恰好可以辅助完成这一功能。

  • 各个任务必须等待外部资源 (如远程文件或 Internet连接)。

  在没有用户界面的程序里,比如说Windows Service, 多线程在当一个任务有潜在的耗时,因为它在等待另台电脑的响应(比如一个应用服务器,数据库服务器,或者一个客户端)的实现特别有意义。用工作线程完成任务意味着主线程可以立即做其它的事情。

4、什么时候不使用多线程  

同样的 ,多线程也存在许多缺点 ,在考虑多线程时需要进行充分的考虑。多线程的主要缺点包括: 

  • 等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。
  • 对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。
  • 线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。
  • 对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。
原文地址:https://www.cnblogs.com/qtiger/p/5812483.html