如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第16章多任务与多线程编程本章主要教学内容第16章多任务与多线程编程16.1程序、进程和线程概述16.1.1多任务、进程和线程一个进程可以有一个或多个线程,其中一个是主线程。16.2线程的种类16.16.1MFC中的线程类16.16.1MFC中的线程类16.16.2用户界面线程(UI)16.16.3工作者线程16.3线程的创建、启动和终止一、AfxBeginThread函数用来创建工作者线程的调用格式:16.函数返回值的说明:CWinThread*pWinThread; pWinThread=AfxBeginThread( ControlFunction, pParam, THREAD_PRIORTY_NORMAL, 0, CREATE_SUSPENDED, NULL);16.3.3线程的终止16.3.3线程的终止16.3.3线程的终止VOIDWINAPIExitProcess(UINTuExitCode);16.4.1线程的运行状态的设置16.4.1线程的运行状态的设置16.4.2线程的优先级16.4.2线程的优先级16.4.2线程的优先级16.4.2线程的优先级16.4.2线程的优先级16.4.2线程的优先级16.4.2线程的优先级16.4.3线程间的通信16.4.3线程间的通信16.4.3线程间的通信16.4.3线程间的通信16.4.3线程间的通信三、使用同步类来实现线程之间的通信和控制 在16.5小节中将详细介绍16.5在VC++环境中使用同步对象16.5在VC++环境中使用同步对象16.5在VC++环境中使用同步对象16.5.1事件对象16.5.1事件对象16.5.1事件对象16.5.1事件对象补充说明:在MFC中,CEvent类对象有两种类型,分别是所谓的手工事件和自动事件。对于自动事件,当其获得信号后,就会释放下一个可用的线程。一个自动CEvent对象在被至少一个线程释放后会自动返回到无信号状态;而人工事件对象获得信号后,释放所有可利用线程,直到调用成员函数ReSetEvent()将其设置为无信号状态时为止。 注意:在创建CEvent类的对象时,默认创建的是自动事件。16.5.1事件对象16.5.1事件对象16.5.1事件对象16.5.1事件对象16.5.1事件对象16.5.1事件对象16.5.1事件对象6.WaitForSingleObject(): 其原型声明如下: DWORDWaitForSingleObject( HANDLEhHandle, DWORDdwMilliseconds )当在线程的执行函数中调用该函数时,线程暂时挂起,系统监视hHandle所指向的对象的状态。如果经过dwMilliseconds毫秒后,hHandle指向的对象变为有信号状态,则WaitForSingleObject()返回,线程被释放,且返回值为WAIT_TIMEOUT;如果在挂起的dwMilliseconds毫秒内,线程所等待的对象在某一时刻变为有信号,则该函数立即返回,返回值为WAIT_OBJECT_0。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。CEvent::ResetEvent()把对象设置为无信号状态,程序在WaitForSingleObject(hHandle,INFINITE)处等待。 CEvent::SetEvent()把对象设置为有信号状态,释放等待的线程。 如果CEvent对象为自动事件,则当WaitForSingleObject(hHandle,INFINITE)返回时,自动把CEvent对象重置为无信号状态。B线程在执行到CEvent类成员函数Lock()时将会发生阻塞,而A线程此时则可以在没有B线程干扰的情况下对共享资源进行处理,并在处理完成后通过成员函数SetEvent()向B发出事件,使其被释放,得以对A先前已处理完毕的共享资源进行操作。16.5.2临界区16.5.2临界区16.5.2临界区16.5.2临界区16.5.3互斥量图:互斥内核对象的工作模型16.5.3互斥量16.5.3互斥量16.5.3互斥量16.5.3互斥量16.5.3互斥量16.5.4信号灯一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。16.5.4信号灯16.5.4信号灯16.5.4信号灯在例子中,开启线程前首先创建了一个初始计数和最大资
as****16
实名认证
内容提供者
最近下载