您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第12章进程与线程的管理
第12章进程与线程的管理本章主要内容:进程、线程和优先级工作线程和用户界面线程线程同步线程通讯进程是拥有应用程序所有资源的对象。从程序设计的角度,进程可以看作一个正在运行的应用程序的实例。线程指运行中的程序的调度单位。线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。一个应用程序(进程)至少要有一个线程,这个线程被叫做主线程。当然,根据需要,一个进程可以创建任意数目的从线程,用这些从线程执行这个进程的并发任务。12.1进程、线程和优先级线程是以抢占的方式来取得CPU这个共享资源的。由于每个进程和线程的重要程度不同,因此每个进程和线程要赋予一个优先级。Windows把线程从0到31分成32个基本级别。0为最低级,31为最高级。Windows用两步来确定线程的优先级,第一步先确定进程的优先级,然后在进程所具有的级别基础上,再该进程中线程的相对优先级。12.1进程、线程和优先级进程的优先级12.1进程、线程和优先级优先级别说明值REALTIME_PRIORITY_CLASSHIGH_NORMAL_PRIORITY_CLASSABOVE_NORMAL_PRIORITY_CLASSNORMAL_PRIORITY_CLASSBELOW_NORMAL_PRIORITY_CLASSIDLE_PRIORITY_CLASS最高级最低级24138612.1进程、线程和优先级12.2工作线程和用户界面线程MFC按线程是否拥有用户界面,把线程分为两种:工作线程和用户界面线程。工作线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。12.2工作线程和用户界面线程工作线程的创建CWinThread*AfxBeginThread(AFX_THREADPROCpfnThreadProc,LPVOIDpParam,intnPriority=THREAD_PRIORITY_NORMAL,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL)PfnThreadProc:指向工作者线程的执行函数的指针,线程函数原型必须声明如下:UINTExecutingFunction(LPVOIDpParam);请注意,ExecutingFunction()应返回一个UINT类型的值,用以指明该函数结束的原因。一般情况下,返回0表明执行成功。pParam:传递给线程函数的一个32位参数,执行函数将用某种方式解释该值。它可以是数值,或是指向一个结构的指针,甚至可以被忽略;nPriority:线程的优先级。如果为0,则线程与其父线程具有相同的优先级;nStackSize:线程为自己分配堆栈的大小,其单位为字节。如果nStackSize被设为0,则线程的堆栈被设置成与父线程堆栈相同大小;dwCreateFlags:如果为0,则线程在创建后立刻开始执行。如果为CREATE_SUSPEND,则线程在创建后立刻被挂起;lpSecurityAttrs:线程的安全属性指针,一般为NULL;12.2工作线程和用户界面线程用户界面线程的创建CWinThread*AfxBeginThread(CRuntimeClass*pThreadClass,intnPriority=THREAD_PRIORITY_NORMAL,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL)pThreadClass是指向CWinThread的一个导出类的运行时类对象的指针,该导出类定义了被创建的用户界面线程的启动、退出等;其它参数的意义同形式上。CWinThread类的数据成员及常用函数m_hThread:当前线程的句柄;m_nThreadID:当前线程的ID;m_pMainWnd:指向应用程序主窗口的指针BOOLCWinThread::CreateThread(DWORDdwCreateFlags=0,UINTnStackSize=0,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL);该函数执行成功,返回非0值,否则返回0。一般情况下,调用AfxBeginThread()来一次性地创建并启动一个线程,但是也可以通过两步法来创建线程:首先创建CWinThread类的一个对象,然后调用该对象的成员函数CreateThread()来启动该线程。virtualBOOLCWinThread::InitInstance();重载该函数以控制用户界面线程实例的初始化。初始化成功则返回非0值,否则返回0。用户界面线程经常重载该函数,工作线程一般不使用InitInstance()。virtualintCWinThread::ExitInstance();在线程终结前重载该函数进行一些必要的清理工作。该函数返回线程的退出码,0表示执行成功,非0值用来标识各种错误。同InitInstance()成员函数一样,该函数也只适用于用户界面线程。12.3线程同步在多线程的情况下,如果在若干个线程要使用同一个资源时,则需要在线程之间进行协调(同步)才能使程序完成预定的工作,而不会出现灾难性的冲突。12.3线程同步12.3线程通讯通常,一个线程为了完成主线程交给的一些任务,就需要在线程与线程之间进行必要的数据联系(通讯)。一般可以用两种方法来进行通讯:使用全局变量和使用自定义的消息。因为同一进程的所有线程运行在相同的地址空间中,所以可以使用全局变量进行线程的通讯。利用向用户界面线程发送消息来实现线程之间的通讯。消息的接收方必须是一个人机界面线程。12.3线程通讯
本文标题:第12章进程与线程的管理
链接地址:https://www.777doc.com/doc-2242767 .html