- 1、本文档共84页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C课件多任务与多系倪程编程
第16章 多任务与多线程编程;;;;; 一个进程可以有一个或多个线程,其中一个是主线程。;;;;;;;一、AfxBeginThread函数用来创建工作者线程的调用格式:;;;;16.函数返回值的说明:;;;CWinThread* pWinThread;
pWinThread=AfxBeginThread(
ControlFunction,
pParam,
THREAD_PRIORTY_NORMAL,
0,
CREATE_SUSPENDED,
NULL);;;;;;;;;;VOID WINAPI ExitProcess( UINT uExitCode ); ;16.4.1 线程的运行状态的设置;;;;;;;;;;;;;;三、使用同步类来实现线程之间的通信和控制
在16.5小节中将详细介绍;;;;;;;; 补充说明:在MFC中,CEvent类对象有两种类型,分别是所谓的手工事件和自动事件。对于自动事件,当其获得信号后,就会释放下一个可用的线程。一个自动 CEvent对象在被至少一个线程释放后会自动返回到无信号状态;而人工事件对象获得信号后,释放所有可利用线程,直到调用成员函数ReSetEvent()将其设置为无信号状态时为止。
注意:在创建CEvent类的对象时,默认创建的是自动事件。 ;;;;;;;;6. WaitForSingleObject( ):
其原型声明如下:
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
); 当在线程的执行函数中调用该函数时,线程暂时挂起,系统监视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先前已处理完毕的共享资源进行操作。 ;;;;;;图:互斥内核对象的工作模型;;;;;;;; 一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出。;;;; 在例子中,开启线程前首先创建了一个初始计数和最大资源计数均为2的信号量对象g_Semaphore。即在同一时刻只允许2个线程进入由g_Semaphore保护的共享资源。; 随后开启的三个线程均试图访问此共享资源,在前两个线程试图访问共享资源时,由于g_Semaphore的当前可用资源计数分别为2和1,此时的g_Semaphore是可以得到通知的,也就是说位于线程入口处的WaitForSingleObject()将立即返回,而在前两个线程进入到保护区域后,g_Semaphore的当前资源计数减少到0,g_Semaphore将不再得到通知,WaitForSingleObject()将线程挂起。直到此前进入到保护区的线程退出后才能得以进入。 ;16.6 本章小结
文档评论(0)