windows多线程基础(1):多进程 or 多线程 ?

从几个问题开始:
(1)进程和线程的关系:资源,性能?
(2)为什么要使用多线程?
(3)windows上用CreateThread创建多线程,有问题么?
(4)为什么要使用_beginthreadex来创建多线程?
(5)用ExitThread退出多线程有问题么?
(6)CRT支持多线程么,_beginthreadex是如何在多线程中协助CRT工作的?
(7)多线程程序中,malloc的性能是否有影响?

本文的内容来自《windows核心编程》第6章 线程的基础知识。

进程构成:内核对象地址空间
线程构成:内核对象线程堆栈。
  • 进程是线程的容器,线程在进程中创建,而且其生命周期内都在该进程中,这意味着线程在其进程空间内执行代码,并且在进程的地址空间对数据进行操作。因此,对于单个进程中的多个线程,这些线程共享同一地址空间(代码段、数据段、堆),还共享内核对象的句柄(因为句柄表依赖于每个进程而不是线程存在的)。
  • 由此可知,进程使用的资源比线程多的多,因为其需要更多的地址空间。为进程创建一个虚拟地址空间需要许多系统资源,系统要保留大量记录,这要占用大量的内存。另外,将exe文件和dll文件加载到地址空间中,也需要系统资源。
  • 线程需要的系统资源要少的多,实际上,线程只有一个内核对象和一个堆栈,保留的记录很少,因此需要很少的系统资源。
所以,相对多进程而言,使用多线程的好处大概有:
  • 占用资源较少,创建开销较小。
  • 共享进程地址空间,线程间通信较之进程间通信更为方便。
结论
     由于线程使用的系统资源比进程少的多,增加线程来解决问题应该优先考虑,而避免创建新的进程。

但是这个规律不是一成不变的,我认为使用多线程可能会存在如下一些问题
  • 对于长时间运行的线程而言,其状态监控可能相对进程来说较为困难,因为我们知道进程是否活着可以很容的获得。但是线程属于某个进程,即使进程活着,也难免保证所有的线程都活着。因此线程的状态监控较为繁琐。
  • 对于多线程的程序而言,很可能会发生某个线程的错误,导致整个进程崩溃。这样的情况下,不如根据各个线程的任务,分为多个进程,各个进程各司其职,来的省事。

参考:
  • 《windows核心编程》第六章基础知识

你可能感兴趣的:(多线程)