2024年3月20日发(作者:)

深入浅出Win32多线程程序设计之基本概念

引言

从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务

操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作

系统却可以一边听音乐,一边编程,一边打印文档。

理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32

多线程程序设计后,理解和学习其它操作系统的多任务控制也非 常容易。许多程序员从来没有学习

过嵌入式系统领域著名的操作系统VxWorks,但是立马就能在上面做开发,大概要归功于平时在Win32

多线程上下的功夫。

因此,学习Win32多线程不仅对理解Win32本身有重要意义,而且对学习和领会其它操作系统

也有触类旁通的作用。

从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作

系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统

却可以一边听音乐,一边编程,一边打印文档。

理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32

多线程程序设计后,理解和学习其它操作系统的多任务控制也非 常容易。因此,学习Win32多线程

不仅对理解Win32本身有重要意义,而且对学习和领会其它操作系统也有触类旁通的作用。

进程与线程

先阐述一下进程和线程的概念和区别,这是一个许多大学老师也讲不清楚的问题。

进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进

行资源分配和调度的一个独立单位。程序只是一组指令的有序 集合,它本身没有任何运行的含义,

只是一个静态实体。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建

而产生,因调度而运行,因等 待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个

程序在一定的数据集上运行的全部动态过程。

线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。线程不能够独立执行,必

须依存在应用程序中,由应用程序提供多个线程执行控制。

线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共

享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出 并清除。线程可与属于同一进

程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行

中必不可少的信息(如程序计数器、 一组寄存器和栈)。

根据进程与线程的设置,操作系统大致分为如下类型:

(1)单进程、单线程,MS-DOS大致是这种操作系统;

(2)多进程、单线程,多数UNIX(及类UNIX的LINUX)是这种操作系统;

注意:

线程机制支持并发程序设计技术,在多处理器上能真正保证并行处理。而在linux实现线程很特别,linux

把所有的线程都当作进程实现。linux下线程看起来就像普通进程(只是该进程和其他进程共享资源,如地址空间)。

上述机制与Microsoft windows或是Sun Solaris实现差异很大。

(3)多进程、多线程,Win32(Windows NT/2000/XP等)、Solaris 2.x和OS/2都是这种操作

系统;

(4)单进程、多线程,VxWorks是这种操作系统。

在操作系统中引入线程带来的主要好处是:

(1)在进程内创建、终止线程比创建、终止进程要快;

(2)同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。另外,线程

的出现还因为以下几个原因:

(1)并发程序的并发执行,在多处理环境下更为有效。一个并发程序可以建立一个进程,而这

个并发程序中的若干并发程序段就可以分别建立若干线程,使这些线程在不同的处理机上执行。

(2)每个进程具有独立的地址空间,而该进程内的所有线程共享该地址空间。这样可以解决父

子进程模型中,子进程必须复制父进程地址空间的问题。

(3)线程对解决客户/服务器模型非常有效。

Win32进程