预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10
亲,该文档总共87页,到这已经超出免费预览范围,如果喜欢就直接下载吧~
如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第13章多线程与多核编程
多任务的并发执行会用到多线程(multithreading),而CPU的多核(mult-core)化又将原来只在巨型机中才使用的并行计算(parallelcomputing)带入普通PC应用的多核程序设计(multi-coreprogramming)中。
13.1进程与线程
进程(process)是执行中的程序,线程(thread)是一种轻量级的进程。
13.1.1进程与多任务
现代的操作系统都是多任务(multitask)的,即可同时运行多个程序。进程(process)是位于内存中正被CPU运行的可执行程序。参见图15-1。
程序=
进程(内存中)
可执行文件(磁/U/光盘上)
运行
图15-1程序与进程
目前的主流计算机采用的都是冯·诺依曼(JohnvonNeumann)体系结构——存储程序计算模型,程序(program)就是在内存中顺序存储并以线性模式在CPU中串行执行的指令序列。对于传统的单核CPU计算机,多任务操作系统的实现是通过CPU分时(time-sharing)和程序并发(concurrency)完成的。即在一个时间段内,操作系统将CPU分配给不同的程序,虽然每一时刻只有一个程序在CPU中运行,但是由于CPU的速度非常快,在很短的时间段中可在多个进程间进行多次切换,所以用户的感觉就像多个程序在同时执行,我们称之为多任务的并发。
13.1.2进程与线程
程序一般包括代码段、数据段和堆栈,对具有GUI(GraphicalUserInterfaces,图形用户界面)的程序还包含资源段。进程(process)是应用程序的执行实例,即正在被执行的程序。每个进程都有自己的虚拟地址空间,并拥有操作系统分配给它的一组资源,包括堆栈、寄存器状态等。
线程(thread)是CPU的调度单位,是进程中的一个可执行单元,是一条独立的指令执行路径。线程只有一组CPU指令、一组寄存器和一个堆栈,它本身没有其他任何资源,而是与拥有它的进程共享几乎一切,包括进程的数据、资源和环境变量等。线程的创建、维护和管理给操作系统的负担比进程要轻得多,所以才叫轻量级的进程(lightweightprocess)。
一个进程可以拥有多个线程,而一个线程只能属于一个进程。每个进程至少包含一个线程——主线程,它负责程序的初始化工作,并执行程序的起始指令。随后,主线程可为执行各种不同的任务而分别创建多个子线程。
一个程序的多个运行,可以通过启动该程序的多个实例(即多个进程)来完成,也可以只运行该程序的一个实例(一个进程),而由该进程创建多个线程来做到。显然后者要比前者更高效,更能节约系统的有限资源。这对需要在同一时刻响应成千上万个用户请求的Web服务器程序和网络数据库管理程序等来说是至关重要的。
多线程图示
其中:A为主线程,B、C、D皆为A的子线程
不同并行任务中的同名子线程可以互不相同
有关进程和线程的进一步内容,大家会在将来的操作系统课程中学到。
13.1.3多线程编程的困难
因为同一程序(进程)的多个线程共享同样的数据和资源,所以会出现同步、排队和竞争等问题,可能导致死锁、无限延迟和数据竞争等现象的发生,这些都需要我们在程序中加以解决。
MFC虽然提供了一个线程类和若干同步类,但是仍然属于线程的低级编程,既困难又繁琐。利用.NET框架类库中的线程命名空间下的线程类,则可以简化线程编程。
13.2MFC的进程和线程编程
使用传统的MFC/C++直接进行进程和线程编程异常复杂和繁琐,需要程序员自己处理线程间的同步、互斥、死锁等具体问题。
13.2.1创建、管理和终止进程
MFC中并没有提供处理进程的类,我们需要直接使用Windows的API函数来创建、管理和终止进程。
1.创建进程
下面的CreateProcess函数用于在当前进程中创建一个新进程(和其主线程),以运行指定(路径/文件名或命令行)的应用程序:
BOOLCreateProcess(//成功返回非0,失败返回0(可用GetLastError函数返回出错代码)
LPCTSTRlpApplicationName,//可执行文件的全路径或文件名,有命令行时可为NULL
LPTSTRlpCommandLine,//命令行参数字符串,有可应用名时可为NULL
LPSECURITY_ATTRIBUTESlpProcessAttributes,//进程的安全属性,NULL表默认安全
LPSECURITY_ATTRIBUTESlpThreadAttributes,//主线程的安全属性,NULL表默认安全
BOOLbInheritHandles,//子进程是否继承新进程的句柄
DWORDdwCreationFlags,//创建标志,用于设置进程的创建状态和优先级别,可为0