- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【译】剖析MFC多线程程序的同步机制
/phinecos/archive/2008/06/27/1231223.html【译】剖析MFC多线程程序的同步机制 原文链接:/KB/cpp/SyncMultithreadedMFC.aspxSynchronization in Multithreaded Applications with MFC? 简介本文探讨基本的同步概念,并实际动手帮助新手掌握多线程编程。本文的重点在各种同步技巧。基本概念在线程执行过程中,或多或少都需要彼此交互,这种交互行为有多种形式和类型。例如,一个线程在执行完它被赋予的任务后,通知另一个线程任务已经完成。然后第二个线程做开始剩下的工作。下述对象是用来支持同步的:1)信号量2)互斥锁3)关键区域4)事件每个对象都有不同的目的和用途,但基本目的都是支持同步。当然还有其他可以用来同步的对象,比如进程和线程对象。后两者的使用由程序员决定,比如说判断一个给定进程或线程是否执行完毕为了使用进程和线程对象来进行同步,我们一般使用Wait*函数,在使用这些函数时,你应当知道一个概念,任何被作为同步对象的内核对象(关键区域除外)都处于两种状态之一:通知状态和未通知状态。例如,进程和线程对象,当他们开始执行时处于未通知状态,而当他们执行完毕时处于通知状态,为了判断一个给定进程或线程是否已经结束,我们必须判断表示其的对象是否处于通知状态,而要达到这样的目的,我们需要使用Wait*函数。Wait*函数 下面是最简单的Wait*函数:DWORD?WaitForSingleObject(?HANDLE?hHandle,?DWORD?dwMilliseconds);参数hHandle表示待检查其状态(通知或者未通知)的对象,dwMilliseconds表示调用线程在被检查对象进入其通知状态前应该等待的时间。若对象处于通知状态或指定时间过去了,这个函数返回控制权给调用线程。若dwMilliseconds设置为INIFINITE(值为-1),则调用线程会一直等待直到对象状态变为通知,这有可能使得调用线程永远等待下去,导致“饿死”。 例如,检查指定线程是否正在执行, dwMilliseconds设置为0,是为了让调用线程马上返回。DWORD?dw?=?WaitForSingleObject(hProcess,?0);switch?(dw){?case?WAIT_OBJECT_0:?//?the?process?has?exited?break;?case?WAIT_TIMEOUT:?//?the?process?is?still?executing?break;?case?WAIT_FAILED:?//?failure?break;}?下一个Wait类函数类似上面的,但它带的是一系列句柄,并且等待其中之一或全部进入已通知状态。DWORD?WaitForMultipleObjects(?DWORD?nCount,?CONST?HANDLE?*lpHandles,?BOOL?fWaitAll,?DWORD?dwMilliseconds); 参数nCount表示待检查的句柄个数,lpHandles指向句柄数组,若fWaitAll为TRUE,则等待所有的对象进入已通知状态,若为FALSE,则当任何一个对象进入已通知状态时,函数返回。dwMilliseconds意义同上。 例如,下面代码判断哪个进程会先结束:HANDLE?h[3];h[0]?=?hThread1;h[1]?=?hThread2;h[2]?=?hThread3;DWORD?dw?=?WaitForMultipleObjects(3,?h,?FALSE,?5000);//任何一个进入已通知就返回switch?(dw){?case?WAIT_FAILED:?//?failure?break;?case?WAIT_TIMEOUT:?//?no?processes?exited?during?5000ms?break;?case?WAIT_OBJECT_0?+?0:?//?a?process?with?h[0]?descriptor?has?exited?break;?case?WAIT_OBJECT_0?+?1:?//?a?process?with?h[1]?descriptor?has?exited?break;?case?WAIT_OBJECT_0?+?2:?//?a?process?with?h[2]?descriptor?has?exited?break;} 句柄数组中索引号为index的对象进入已通知状态时,函数返回WAIT_OBJECT_0 + 索引号。若fWaitAll为TRUE,则当所有对象进入已通知状态时,函数返回WAIT_OBJECT_0。 一个线程若调用
文档评论(0)