预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共34页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

线程的创建和运行第三章线程的创建和运行3.1基本概念Windows进程操作系统启动进程线程的构成 线程的内核对象,操作系统用它来对线程实施管理 线程堆栈,用于维护线程在执行代码时候需要的所有函数局部变量。 线程上下文(一组CPU寄存器状态,特别是指令指针寄存器和堆栈指针寄存器) 指令寄存器和堆栈寄存器记录的地址都用于标志拥有线程的进程地址空间中的内存线程和进程 进程比线程使用更多的系统资源,原因是它需要更多的地址空间。为进程创建一个虚拟地址空间,需要很多系统资源,同时,系统中要保留大量的记录,这也要占用大量的内存。 另外,dll或者exe需要加载到一个地址空间,也需要文件资源。 线程只需要一个内核对象和一个堆栈,保留的记录很少,因此需要很少的内存􀂾 Windows中进程是不活泼的,进程从来不执行任何东西,进程只是线程的容器􀂾 应该用增加线程来解决编程问题,避免创建新的进程。Windows线程的优先级 每个线程都会被赋予一个从0-31的优先级号码 只要是高优先级的线程是可以调度的,系统绝对不会调度低优先级的(Starvation) 系统引导的时候创建特殊的线程——0页线程,其优先级为0,当系统中没有任何其他线程运行时,0页线程负责将系统中所有的空闲RAM页面置0 进程内使用线程相对的优先级:空闲、最低、低于正常、正常、高于正常、最高、关键时间 进程也根据具体情况被分为5个进程优先级类:空闲、低于正常、正常、高于正常、实时 线程的实际优先级是进程优先级类和进程内线程相对优先级的组合 正常优先级类的进程的基本优先级是5,进程内正常优先级线程的优先级是8,所以一个正常进程中的正常优先级线程的真正优先级是133.2线程的创建何时创建一个进程的主线程 线程用于描述进程中的运行路径。每当进程被初始化,系统就要创建一个主线程。该线程和C/C++运行库的启动代码一道开始运行,启动代码则调用进入点函数。并且继续运行直到进入点函数返回并且C/C++运行库的启动代码调用ExitProcess为止线程进入点函数 每个线程必须有一个进入点函数,线程从这个进入点开始运行。 一个进程的主线程的进入点函数 main,wmain,WinMain,wWinMain 一个辅助线程的进入点函数:例如 DWORDWINAPIThreadFunc(LPVOIDpvParam) { DWORDdwResult=0; ….. returndwResult. }CreateThread函数 在一个已经运行的线程中创建辅助线程 HANDLECreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes,//安全性,缺省NULL SIZE_TdwStackSize,//initialstacksize,0表示和调用线程一样大小 LPTHREAD_START_ROUTINElpStartAddress,//threadfunction LPVOIDlpParameter,//threadargument,传递给线程的参数,NULL则不传参 DWORDdwCreationFlags,//creationoption,用于确定线程创建后是否立即运行,0则立即运行 LPDWORDlpThreadId//[out]threadidentifier,NULL则线程标识不返回 );创建线程Win32例子程序 #include“windows.h” DWORDWINAPIThreadFunc(voidpParam) { //….Dosomefunction return0; }Intmain() { hThreadHandle=CreateThread( NULL,//使用默认的安全属性 0,//堆栈大小,使用windows默认(1M) ThreadFunc,//线程的入口函数名 (LPVOID)NULL,//线程入口函数的参数 0,//表示线程立刻执行 &dwThreadID//输出线程的ID ); dwRet=WaitForSingleObject(hThreadHandle,INFINITE);//等待线程退出 if(dwRet==WAIT_OBJECT_0) { printf(“WorkThreadAlreadyExits!\n”); } DeleteObject(hThreadHandle);//释放内核对象资源 return0; }创建线程MFC例子程序创建线程AfxBeginThread创建线程_AfxThreadEntry3.3终止线程合理终止线程 线程的退出应该尽可能的使用第一种方式,让线程自己正常的退出。 始终都应该将线程设计成这样的形式,即,如果想要线程退出,则线程的函数就能够正常的返回。这是确保所有的线程资源被正确的清除的唯一办法