线程由内核对象和线程栈组成。
内核对象:操作系统用它来对线程实施管理,内核对象也是系统用来存放线程统计信息的地方,但创建线程时,系统创建一个内核对象,该线程内核对象不是线程本身,而是操作系统用来管理线程的较小数据结构,可以将线程内核对象视为有关于线程的统计信息组成的一个小型数据结构。
线程栈:它用于维护线程在执行代码时需要的所有函数参数和局部变量。
线程是操作系统调度的最小单位。线程包含在进程中,是进程中实际运行的单位。一个进程中可以同时运行多个线程,每个线程可以执行不同的任务,这就是所谓的多线程。同一进程中的多个线程将共享该进程中的全部系统资源,如虚拟地址空间、文件描述符和信号处理等,但是同一个进程中的多个线程都有各自的调用栈、寄存器环境和线程本地存储。
对于单核(单CPU)系统来说,即便处理器一次只能运行一个线程,但是操作系统通过时间片轮转技术,在不同的线程之间进行切换,让用户产生可以同时处理多个任务的错觉,这样的程序运行机制称为软件的多线程。
对于多核(多个CPU)系统来说,这样的系统能同时进行真正的多线程多任务处理。这种运行机制可以称为硬件的多线程技术。
线程总是在某个进程环境中创建的,而且会在这个进程内部销毁.系统从进程的地址工具中分配内存,供线程的栈使用,新的线程运行的进程环境与创建线程的环境相同,因此,新线程可以访问进程的内核对象的所有句柄(因为句柄表是针对每一个进程的,而不是针对每个线程的),进程中的所有内存和在这个相同进程中的所有线程的堆栈.这使得单个进程中的多个线程确实能非常容易的相互通信。
多线程程序作为一种多任务、并发的工作方式,有以下的优点:
- 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。
- 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
- 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
相对于进程来说
对进程创建来说,系统要分配进程很大的私有空间,当然它占用的资源也就很多,而对多线程程序来说,多个线程共享一个地址空间,所以占用资源较少。
进程间切换时,需要交换整个地址空间,而线程之间切换时候只是切换执行环境,因此效率更高。
单线程与多线程的执行区别:
当然,多线程访问共享变量时要避免多个线程同时对共享变量进行操作。