




已阅读5页,还剩69页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
BOOST应用初探作者冯刚2011841背景BOOST是由C标准化委员会成员参与开发的C标准的准官方库,他是C标准库的发动机。下一代C标准C0X的标准库很多来自于BOOST。BOOST库覆盖了广泛的领域,从数学库到智能指针,从模板元编程库到预处理器库及语法词法分析,从线程到LAMBDA表达式,等等。所有BOOST库都具有宽松的许可证,确保库可以被自由使用于商用软件。2功能21概况BOOST库涵盖了很广泛的领域,下面就常用的功能像智能指针,正则表达式,函数对象BIND和FUNCTION,线程和线程池,时间日期,多索引容器,哈希容器,BIMAP,日志,内存池,模板元编程,循环缓冲区,TUPLE,观察者模式SIGNAL2,网络通讯ASIO做一些介绍。22功能221智能指针2211概论SMARTPOINTERS(智能指针)是存储“指向动态分配(在堆上)的对象的指针”的对象。他们的行为很像C的内建指针,只是它们可以在适当的时候自动删除它们所指向的对象。智能指针在面对异常时有非常显著的作用,它们可以确保动态分配对象的完全析构。它们还可以用于跟踪多主人共享的动态分配对象。在概念上,智能指针可以看作拥有它所指向的对象,并因此在对象不再需要时负责将它删除。智能指针库提供了六个智能指针类模板SCOPED_PTR简单的单一对象的唯一所有权。不可拷贝。SCOPED_ARRAY简单的数组的唯一所有权。不可拷贝。SHARED_PTR在多个指针间共享的对象所有权。SHARED_ARRAY在多个指针间共享的数组所有权。WEAK_PTR一个属于SHARED_PTR的对象的无所有权的观察者。INTRUSIVE_PTR带有一个侵入式引用计数的对象的共享所有权。这些模板被设计用来补充STDAUTO_PTR模板的不足。2212智能指针SHARED_PTRSHARED_PTR类模板存储一个指向动态分配对象(一般是用CNEWEXPRESSION生成的)的指针。在最后一个SHARED_PTR所指向的对象被销毁或重置时,要保证它所指向的对象被删除。每一个SHARED_PTR都符合C标准库的COPYCONSTRUCTIBLE和ASSIGNABLE的必要条件,并因此能够用于标准库容器。因为提供了比较操作,因此SHARED_PTR可以和标准库中的关联式容器一起工作。通常,一个SHARED_PTR不能正确地持有一个指向动态分配的数组的指针。关于那种用法请参见SHARED_ARRAY。因为在实现中使用了引用计数,SHARED_PTR实例的循环引用不会被回收。例如,如果MAIN持有一个指向A的SHARED_PTR,A又直接或间接持有一个指回A的SHARED_PTR,A的使用计数是2。最初的SHARED_PTR析构后将导致一个使用计数为1的A被悬挂。使用WEAK_PTR以“打破循环”。这个类模板被T参数化,T是被指向的对象的类型。SHARED_PTR和它的大多数成员函数对于T没什么要求,允许它是一个不完整类型,或者为VOID。对T有附加要求的成员函数CONSTRUCTORS,RESET都明确地记录在下面。只要T能被隐式地转换到U,则SHARED_PTR就能被隐式地转换到SHARED_PTR。特别是,SHARED_PTR隐式转换到SHARED_PTR,当U是T的一个可访问基类的时候,还能转换到SHARED_PTR,以及转换到SHARED_PTR。惯用手法由于智能指针是线程安全的,建议在代码里只为一个对象生成单一的SHARED_PTR,在多线程环境中传递参数时使用WEAK_PTR,这样当SHARED_PTR被析构,WEAK_PTR也会得到通知,变为无效,这样可以有效地防止野指针,同时也防止了潜在的循环引用,无法释放对象的问题。SHARED_PTRSPASHARED_PTRNEWAINTFUNCWEAK_PTRWPAIFWPAEXPIRED()/正常处理逻辑SHARED_PTRSPAWPALOCK/USESPAELSE/智能指针已被其他线程释放FUNCSPA2213智能指针WEAK_PTR简介WEAK_PTR是BOOST智能指针SHARED_PTR的一个重要伙伴。它允许打破循环依赖。另外,它还可以处理一个非常常见的问题悬空指针。当销毁最后一个智能指针SHARED_PTR,它会释放掉共享的资源。通过使用智能指针WEAK_PTR,这方面的信息会传播给所有观察该共享资源的智能指针WEAK_PTR,通过WEAK_PTR可以知道该共享资源已经释放,这意味着不会发生无意间访问无效指针的情形。这就是观察者模式的一个特例,也就是说,当销毁资源的时候,就会通知所有对资源感兴趣的WEAK_PTR,通过调用WEAK_PTREXPIRED,当返回值为TRUE时,就表示该共享资源已经释放了。WEAK_PTR类模板存储一个引向已被SHARED_PTR管理的对象的“WEAKREFERENCE“(弱引用)。为了访问这个对象,一个WEAK_PTR可以利用SHARED_PTR的构造函数或成员函数LOCK转换为SHARED_PTR。当最后一个指向对象的SHARED_PTR消失,而对象也被删除后,从一个引向已被删除对象的WEAK_PTR实例获取SHARED_PTR的企图就会失败构造函数会抛出一个BOOSTBAD_WEAK_PTR类型的异常,而WEAK_PTRLOCK会返回一个EMPTYSHARED_PTR。每一个WEAK_PTR都符合C标准库的COPYCONSTRUCTIBLE和ASSIGNABLE的必要条件,并因此能够用于标准库容器。因为提供了比较操作,因此WEAK_PTR可以和标准库中的关联式容器一起工作。WEAK_PTR的操作绝不会抛出异常。这个类模板被T参数化,T是被指向的对象的类型。相对于SHARED_PTR,WEAK_PTR提供了一个非常有限的操作子集,因为在多线程程序中访问它所存储的指针是非常危险的,甚至有时在一个单线程程序中也是不安全的(也就是说,它可能引起未定义行为)。姑且假设WEAK_PTR有一个返回RAWPOINTER(裸指针)的GET成员函数,考虑下面这个无辜的代码片段SHARED_PTRPNEWINT5WEAK_PTRQP/SOMETIMELATERIFINTRQGET/USER设想在IF之后,但是又恰恰在R被使用之前,另一个线程执行了语句PRESET。这样R就成了一个DANGLINGPOINTER(悬挂指针)。解决这个问题的方案是从Q创建一个临时的SHARED_PTRSHARED_PTRPNEWINT5WEAK_PTRQP/SOMETIMELATERIFSHARED_PTRRQLOCK/USER这样,R就持有一个引向Q所指向的对象的引用。即使在其它线程中执行了PRESET,那个对象也会继续活着,直到R离开作用域或者被RESET。通过获得一个指向这个对象的SHARED_PTR,我们可以有效地保住它不被析构。222正则表达式XPRESSIVE是一个先进的、面向对象的、用于C的正则表达式模板库。正则表达式可以以字符串方式编写并在运行期分析,也可以以表达式模板方式编写并在编译期分析。正则表达式可以相互引用,或者递归引用其本身,你就可以用它们来构建任意复杂的语法。它与BOOSTREGEX库的区别就是无需编译,全模板库。如果你要在C中处理文本,通常你有两个不相交的选项正则表达式引擎或语法分析生成器。正则表达式引擎如BOOSTREGEX更为强大和灵活;文本的模式以字符串方式表示,可以在运行期指定。但是,这意味着语法错误同样要到运行期才能被检测。另外,正则表达式不适合于高级的文本处理任务,如匹配平衡的、嵌套的标签。那些任务传统上都是由语法分析生成器如SPIRIT语法分析器框架来处理的。这些工具更为强大,但不够灵活。它们通常不允许你随时随意地修改你的语法规则。此外,它们不具备正则表达式的完全回溯语义,对于某些类型的模式来说,这样对作者更具有挑战性。将这两种方法无缝地集合到一起,在C的文本处理世界中占据了独特的优势。通过XPRESSIVE,你可以选择更象使用BOOSTREGEX那样去使用它,将正则表达式表示为字符串。或者你也可以象使用SPIRIT那样使用它,将你的REGEXES写为C表达式,获得一种专用于文本处理的嵌入式语言所带来的所有好处。更重要的是,你可以混用这两种方式,从而获得两者的好处,对于那些要静态绑定的正则表达式编写正则表达式语法由编译器进行硬编码和语法检查其它的则动态绑定并在运行期指定。这些正则表达式可以相互递归地引用,在以前的正则表达式不能进行模式匹配的字符串中进行模式匹配。XPRESSIVE是一个只含头文件的模板库,这意味着你不需要修改你的构建脚本或链接任何独立的LIB文件就可以使用它。你所要做的就是INCLUDE。如果你只使用静态REGEXES,你可以只包含XPRESSIVE_STATICHPP以提高编译速度。同样,如果你计划只使用动态REGEXES,则可以只包含XPRESSIVE_DYNAMICHPP。表281XPRESSIVE的工具箱TOOL工具DESCRIPTION说明BASIC_REGEX含有一个已编译的正则表达式。BASIC_REGEX是XPRESSIVE之中最重要的类型。你用XPRESSIVE做的任何事情都要从创建一个类型为BASIC_REGEX的对象开始。MATCH_RESULTS,SUB_MATCHMATCH_RESULTS含有REGEX_MATCH或REGEX_SEARCH操作的结果。它就象一个存有SUB_MATCH对象的向量。一个SUB_MATCH对象含有一个已标记的子表达式在PERL中又称为后向引用。基本上,它只是一个迭代器对,代表了已标记子表达式的开始和结束。REGEX_MATCH检查一个字符串是否匹配一个REGEX。REGEX_MATCH要成功,必须是整个字符串从头到尾匹配REGEX。如果你给了REGEX_MATCH一个MATCH_RESULTS,那么它会将所有找到的带标记子表达式写入其中。REGEX_SEARCH查找一个字符串,以发现其中匹配REGEX的子字符串。REGEX_SEARCH将尝试在字符串的每个位置查找匹配,从头部开始,当找到一个匹配或者整个字符串找完时停止。使用REGEX_MATCH时,如果你给了REGEX_SEARCH一个MATCH_RESULTS,那么它会将所有找到的带标记子表达式写入其中。REGEX_REPLACE给定一个输入字符串,一个REGEX和一个替代字符串,REGEX_REPLACE通过将输入字符串中与REGEX相匹配的部分替换为替代字符串来构建一个新的字符串。替代字符串可以含有对带标记子表达式的引用。REGEX_ITERATOR一个与STL兼容的迭代器,可以很方便地找到在一个字符串中与某个REGEX匹配的所有地方。解引用一个REGEX_ITERATOR会返TOOL工具DESCRIPTION说明回一个MATCH_RESULTS。递增一个REGEX_ITERATOR可以找出下一个匹配。REGEX_TOKEN_ITERATOR类似于REGEX_ITERATOR,除了一点,解引用一个REGEX_TOKEN_ITERATOR会返回一个字符串。缺省地,它返回与REGEX匹配的整个子字符串,不过它也可以被配置为每次返回任一个或整个带标记子表达式,或者甚至是不匹配REGEX的部分字符串。REGEX_COMPILER一个用于BASIC_REGEX对象的工厂。它将一个字符串“编译“为正则表达式。通常,你不需要直接关心REGEX_COMPILER,因为BASIC_REGEX类有一个工厂方法,其内部使用了REGEX_COMPILER。不过,如果你需要做一些花哨的东西,如创建一个带有不同STDLOCALE的BASIC_REGEX对象,你就需要显式使用REGEX_COMPILER了。现在你应该对XPRESSIVE所提供的工具有了一些了解,你可以通过回答以下两个问题来找到合适的工具1你要用哪种类型的迭代器来遍历你的数据2你要对你的数据做什么操作弄明白你的迭代器类型在XPRESSIVE中的多数类都是根据迭代器类型参数化的模板类。XPRESSIVE定义了一些常用的TYPEDEFS来让你可以更容易地选择合适的类型。你可以用下表基于你的迭代器类型来找到正确的类型。下表为XPRESSIVETYPEDEFS与迭代器类型STDSTRINGCONST_ITERATORCHARCONSTSTDWSTRINGCONST_ITERATORWCHAR_TCONSTBASIC_REGESREGEXCREGEXWSREGEXWCREGEXSTDSTRINGCONST_ITERATORCHARCONSTSTDWSTRINGCONST_ITERATORWCHAR_TCONSTXMATCH_RESULTSSMATCHCMATCHWSMATCHWCMATCHREGEX_COMPILERSREGEX_COMPILERCREGEX_COMPILERWSREGEX_COMPILERWCREGEX_COMPILERREGEX_ITERATORSREGEX_ITERATORCREGEX_ITERATORWSREGEX_ITERATORWCREGEX_ITERATORREGEX_TOKEN_ITERATORSREGEX_TOKEN_ITERATORCREGEX_TOKEN_ITERATORWSREGEX_TOKEN_ITERATORWCREGEX_TOKEN_ITERATOR你要留意系统的命名习惯。这些类型经常要一起使用,所以命名习惯可以帮助你一致地使用它们。例如,如果你有一个SREGEX,你就应该使用SMATCH。如果你用的不是以上四种迭代器类型之一,那么你可以直接用模板并指定你的迭代器类型。示例以下你将看到六个完整的示例程序。检查整个字符串是否匹配一个REGEX这是来自于“简介“一节中的示例。为便于查看,在此重复。INCLUDEINCLUDEUSINGNAMESPACEBOOSTXPRESSIVEINTMAINSTDSTRINGHELLO“HELLOWORLD“SREGEXREXSREGEXCOMPILE“WW“SMATCHWHATIFREGEX_MATCHHELLO,WHAT,REXSTDCOUT进行索引访问。INCLUDEINCLUDEUSINGNAMESPACEBOOSTXPRESSIVEINTMAINCHARCONSTSTR“IWASBORNON5/30/1973AT7AM“/以名字定义一些定制的MARK_TAGS,比S1,S2等更有意义。MARK_TAGDAY1,MONTH2,YEAR3,DELIM4/该REGEX查找一个日期CREGEXDATEMONTHREPEAT_D/查找月份DELIMSET/,/后跟一个分隔符DAYREPEAT_DDELIM/和一个日期再跟一个分隔符YEARREPEAT_D_D/和年份。CMATCHWHATIFREGEX_SEARCHSTR,WHAT,DATESTDCOUTINCLUDEUSINGNAMESPACEBOOSTXPRESSIVEINTMAINSTDSTRINGSTR“IWASBORNON5/30/1973AT7AM“/基本上与上一个例子中的REGEX相同,但用的是动态REGEXSREGEXDATESREGEXCOMPILE“D1,2/D1,22D21,2“/和在PERL中一样,STRREGEX_REPLACESTR,DATE,FORMATSTDCOUT5/30/1973AT7AM查找匹配某个REGEX的所有子串并每次一个地分步处理它们以下程序在一个宽字符串中查找单词。它使用WSREGEX_ITERATOR。注意,对WSREGEX_ITERATOR的解引用将产生一个WSMATCH对象。INCLUDEINCLUDEUSINGNAMESPACEBOOSTXPRESSIVEINTMAINSTDWSTRINGSTRL“THISISHISFACE“/查找一个完整的单词WSREGEXTOKENALNUMWSREGEX_ITERATORCURSTRBEGIN,STREND,TOKENWSREGEX_ITERATORENDFORCURENDCURWSMATCHCONSTSTDWCOUTINCLUDEINCLUDEUSINGNAMESPACEBOOSTXPRESSIVEINTMAINSTDSTRINGSTR“ERIC440,KARL335,FRANCESCA232“/查找比赛时间SREGEXTIMESREGEXCOMPILE“DDD“/对于每个匹配,记号迭代器首先取出第一个被标记的子表达式的值,然后是第二个子表达式的值INTCONSTSUBS1,2SREGEX_TOKEN_ITERATORCURSTRBEGIN,STREND,TIME,SUBSSREGEX_TOKEN_ITERATORENDFORCURENDCURSTDCOUT返回字符串中不匹配该REGEX的其余部分。INCLUDEINCLUDEUSINGNAMESPACEBOOSTXPRESSIVEINTMAINSTDSTRINGSTR“NOWISTHETIMEFORALLGOODMENTOCOMETOTHEAIDOFTHEIRCOUNTRY“/FINDAHTMLTAG查找一个HTML标签SREGEXHTMLOPTIONAL/_W/以下的1指示记号迭代器显示字符串中不匹配正则表达式的部分。SREGEX_TOKEN_ITERATORCURSTRBEGIN,STREND,HTML,1SREGEX_TOKEN_ITERATORENDFORCURENDCURSTDCOUTVOIDOPERATORMATCH_RESULTSCONSTCHAR_TYPESPACE_CHCHAR_TYPESTDFILL_NSTDOSTREAM_ITERATORSTDCOUT,TABS_4,SPACE_CH/输出匹配结果STDCOUTF,_1,_1X/FX,X,IEZERO有些编译器遇到BINDF,语法会发生问题。出于可移植性的原因,一种和上面的意思相同的可选的表达方式也被支持BOOSTBINDBOOSTTYPE,F,_1,_1X但是要注意,这种可选语法只是作为一个WORKAROUND提供。它不是接口的一部分。当函数对象暴露了一个名为RESULT_TYPE的内嵌类型时,显式返回类型可以被省略INTX8BINDSTDLESS,_1,9X/XMEM_FNXXSHARED_PTRPNEWXINTI5BIND/XFIBIND/INTERNALCOPYOFXFIBIND/INTERNALCOPYOFPFI最后两个示例的有趣之处在于它们生成“自包含”的函数对象。BIND/FGX当函数对象被调用的时候,如果没有指定顺序,内部BIND表达式先于外部BIND表达式被求值,在外部BIND表达式被求值的时候,用内部表达式的求值结果取代它们的占位符的位置。在上面的示例中,当用参数列表X调用那个函数对象的时候,BINDG,_1X首先被求值,生成GX,然后BINDF,GXX被求值,生成最终结果FGX。BIND的这个特性可被用来执行函数组合。参见示例BIND_AS_COMPOSECPP,示范如何用BIND达到与BOOSTCOMPOSE类似的功能。注意第一个参数被绑定函数对象是不被求值的,即使它是一个由BIND生成的函数对象或一个占位符参数,所以下面的示例不会如你所愿地工作TYPEDEFVOIDPFINTSTDVECTORVSTDFOR_EACHVBEGIN,VEND,BIND_1,5你所要的效果,可以通过将一个辅助函数对象APPLY用作它的第一个参数而获得,作为一个函数对象,它可以支撑它的参数列表。为了方便起见,在BOOST/BIND/APPLYHPP头文件中提供了一个APPLY的实现。下面是一个前面的示例的修改版本TYPEDEFVOIDPFINTSTDVECTORVSTDFOR_EACHVBEGIN,VEND,BINDAPPLY,_1,5尽管在缺省情况下,第一个参数是不被求值的,而所有其它参数被求值。但有时候不需要对第一个参数之后的其它参数求值,甚至当它们是内嵌BIND子表达式的时候也不需要。这可以由另一个函数对象PROTECT来帮助做到,它将类型掩饰起来,让BIND无法对它进行识别和求值。在被调用的时候,PROTECT只是简单地不加更改地将参数列表转送到其它函数对象中。头文件BOOST/BIND/PROTECTHPP包含一个PROTECT的实现。要在求值中保护一个BIND函数对象,使用PROTECTBINDF,。(重载的操作符(BOOST133新增)为了方便起见,由BIND生成的函数对象重载了LOGICALNOT(逻辑非)操作符和关系操作符,/REMOVEINVISIBLEOBJECTS以及方便地将BIND的结果和一个值进行比较STDFIND_IFFIRST,LAST,BINDSTDFIND_IFFIRST,LAST,BIND和一个占位符进行比较BINDCLASSPLAYERPUBLICVOIDPLAYVOIDSTOPBUTTONPLAYBUTTON,STOPBUTTONPLAYERTHEPLAYERVOIDCONNECTPLAYBUTTONONCLICKBOOSTBINDSTOPBUTTONONCLICKBOOSTBIND224线程库2241线程管理22411创建线程CLASSPARAMINTVALUESHARED_PTRSPPARAMNEWSHARED_PTRNEWPARAMCLASSAINTRUNWEAK_PTRPARAMSHARED_PTRSPANEWSHARED_PTRNEWABOOSTSHARED_PTRTHREADNEWBOOSTTHREADBOOSTBIND22412等待线程退出THREADJOINBOOSTSYSTEM_TIMEXTDELAY3BOOLCONSTJOINEDTHREADTIMED_JOINXTTHREADTIMED_JOINBOOSTPOSIX_TIMESECONDS322413线程中断THREADINTERRUPT22414线程休眠BOOSTTHIS_THREADSLEEPBOOSTPOSIX_TIMEMILLISECONDS1022415获取线程IDTHREADIDGET_IDCONST返回值如果THIS标识一个线程执行体,返回有效线程标识(BOOSTTHREADID。否则返回空的线程标识(DEFAULTCONSTRUCTEDBOOSTTHREADID。抛出无THREADGET_ID22416线程退出的处理VOIDEXIT_FUNCINTEXITCODEBOOSTTHIS_THREADAT_THREAD_EXITBOOSTBINDEXIT_FUNC,02242线程池线程池的种类先进先出队列线程池TYPEDEFTHREAD_POOLFIFO_POOL后进先出队列线程池TYPEDEFTHREAD_POOLLIFO_POOL优先级队列线程池TYPEDEFTHREAD_POOLPRIO_POOL示例TYPEDEFFIFO_POOLPOOL/创建线程池BOOSTTHREADPOOLPOOLPOOLPOOLSIZE_CONTROLLERRESIZE10/调度线程池/这样调度BOOSTTHREADPOOLFUTUREFUTBOOSTTHREADPOOLSCHEDULEPOOL,BOOSTBINDFUNC,1或者这样调度POOLSCHEDULEBOOSTBINDFUNC,ERR;或那样调度PACKAGED_TASKPFUNCBOOSTBINDFUNC,1UNIQUE_FUTUREUFPFUNCGET_FUTUREPOOLSCHEDULEBOOSTMOVEPFUNCPACKAGED_TASKPFUNC1BOOSTBINDFUNC,1UNIQUE_FUTUREUF1PFUNCGET_FUTUREPOOLSCHEDULEBOOSTMOVEPFUNC1WAIT_FOR_ALLUF,UF1;COUTWAIT或者定时等待BOOSTXTIMEXTBOOSTXTIME_GETXTSEC30XTNSECNSIO_FUTTIMED_WAITXT2243同步处理22431互斥量互斥量对象简化了线程间数据竟态保护和数据同步。一个线程通过一个锁定函数取得一个互斥量的所有权,通过一个对应的解锁函数释放所有权。互斥量可以是支持递归所有权的或非递归所有权的,也可以同时属于多个线程。BOOSTTHREAD库提供递归和非递归互斥量,支持排他型的所有权和共享所有权MULTIPLEREADER/SINGLEWRITER。所有权概念BOOSTTHREAD库支持四种基本的所有权概念LOCKABLE,TIMEDLOCKABLE,SHAREDLOCKABLE和UPGRADELOCKABLE。每种互斥量依据自己的目标实现一种或多种概念。LOCKABLE概念VOIDLOCKBOOLTRY_LOCKVOIDUNLOCK实现LOCKABLE概念需要提供下面的成员函数VOIDLOCKBOOLTRY_LOCKVOIDUNLOCK通过函数LOCK或函数TRY_LOCK获取的所有权需要通过UNLOCK来释放。TIMEDLOCKABLE概念TIMEDLOCKABLECONCEPT概念细化了LOCKABLECONCEPT概念,支持尝试获取所有权时超时放弃。实现TIMEDLOCKABLECONCEPT概念的类型除了需要实现LOCKABLECONCEPT概念。还需要提供下面的成员函数BOOLTIMED_LOCKBOOSTSYSTEM_TIMECONSTTEMPLATEBOOLTIMED_LOCKDURATIONTYPECONST通过函数TIMED_LOCK获取的所有权需要通过UNLOCK来释放。BOOLTIMED_LOCKBOOSTSYSTEM_TIMECONSTBOOLTRY_LOCK_SHAREDBOOLUNLOCK_SHAREDBOOLTIMED_LOCK_SHAREDBOOSTSYSTEM_TIMECONST通过函数LOCK_SHARED,TRY_LOCK_SHARED或TIMED_LOCK_SHARED获取的所有权需要通过UNLOCK_SHARED来释放。VOIDLOCK_SHARED效果当前线程阻塞直到取得互斥量的共享所有权。后置条件当前线程取得互斥量的共享所有权。抛出如果出错抛出BOOSTTHREAD_RESOURCE_ERROR异常。BOOLTRY_LOCK_SHARED效果当前线程尝试取得该互斥量的共享所有权,线程不阻塞。返回如果取得互斥量的共享所有权返回TRUE,否则返回FALSE。后置条件如果返回TRUE,当前线程取得互斥量的共享所有权。抛出如果出错抛出BOOSTTHREAD_RESOURCE_ERROR异常。BOOLTIMED_LOCK_SHAREDBOOSTSYSTEM_TIMECONST。返回如果取得互斥量的共享所有权返回TRUE,否则返回FALSE。后置条件如果返回TRUE,当前线程取得互斥量的共享所有权。抛出如果出错抛出BOOSTTHREAD_RESOURCE_ERROR异常。VOIDUNLOCK_SHARED前置条件当前线程拥有互斥量的共享所有权。效果释放当前线程拥有的互斥量共享所有权。后置条件当前线程不在拥有该互斥量共享所有权。抛出无UPGRADELOCKABLE概念UPGRADELOCKABLECONCEPT是SHAREDLOCKABLECONCEPT的细化,特点在于允许所有权升级到独占状态。这是对共享所有权支持的MULTIPLEREADER/SINGLEWRITE模型的一个扩展一个线程可以拥有UPGRADABLEOWNERSHIP而同时其他线程拥有共享所有权该线程可以在任何时候试图升级其所有权为独占式所有,如果此时没有其他线程拥有共享所有权,升级立即完成,该线程就会拥有独占所有权,这个所有权需要通过UNLOCK来释放,就像这个所有权是通过LOCK取得一样。如果该线程试图升级到独占所有时,其他线程拥有对应的共享所有权,升级会失败,该线程阻塞直到其获得独占所有权。UPGRADELOCKABLECONCEPT中的所有权也可以降级独占式所有权可以降级为可升级所有权或者共享所有权,可升级所有权可以降级为一般共享所有权。如果一个类型要实现UPGRADELOCKABLECONCEPT概念,除了需要实现SHAREDLOCKABLECONCEPT概念,它还需要提供下面的成员函数VOIDLOCK_UPGRADEBOOLUNLOCK_UPGRADEVOIDUNLOCK_UPGRADE_AND_LOCKVOIDUNLOCK_AND_LOCK_UPGRADEVOIDUNLOCK_UPGRADE_AND_LOCK_SHARED通过函数LOCK_UPGRADE取得的所有权需要通过函数UNLOCK_UPGRADE来释放。如果所有权类型通过函数UNLOCK_XXX_AND_LOCK_YYY改变,所有权必须通过新所有权对应的释放函数来释放。VOIDLOCK_UPGRADE效果当前线程阻塞直到它获得可升级所有权。后置条件当前线程取得该对象的可升级所有权。抛出如果出错抛出BOOSTTHREAD_RESOURCE_ERROR异常。VOIDUNLOCK_UPGRADE前置条件当前线程拥有该对象的可升级所有权。效果释放当前线程拥有的该对象的可升级所有权。后置条件当前线程不在拥有该对象的可升级所有权。抛出无VOIDUNLOCK_UPGRADE_AND_LOCK前置条件当前线程拥有该对象的可升级所有权。效果当前线程自动释放拥有的该对象可升级所有权,并试图取得该对象的独占所有权,线程阻塞直到其获得独占所有权。后置条件当前线程拥有该对象的独占所有权。抛出无VOIDUNLOCK_UPGRADE_AND_LOCK_SHARED前置条件当前线程拥有该对象的可升级所有权。效果当前线程自动释放拥有的该对象可升级所有权,取得共享所有权,该函数会立即返回。后置条件当前线程拥有该对象的共享所有权。抛出无VOIDUNLOCK_AND_LOCK_UPGRADE前置条件当前线程拥有该对象的独占所有权。效果当前线程自动释放拥有的该对象独占级所有权,取得可升级所有权,该函数会立即返回。后置条件当前线程自动拥有该对象可升级所有权。抛出无锁定类型(LOCKTYPES)LOCK_GUARDUNIQUE_LOCKSHARED_LOCKUPGRADE_LOCKUPGRADE_TO_UNIQUE_LOCKSCOPED_TRY_LOCKLOCK_GUARDLOCK_GUARDLOCKABLELOCK_GUARDLOCKABLELOCK_GUARDBOOSTLOCK_GUARD非常简单构造函数传入一个可锁定对象,构造函数取得可锁定对象的所有权。析构时释放所有权。这样为可锁定对象提供了一个RAII风格的外观,方便实现异常安全的锁定和解锁。额外的,构造函数THELOCK_GUARDLOCKABLECONSTTRY_TO_LOCK_TTRY_TO_LOCKCONSTADOPT_LOCK_TADOPT_LOCKUNIQUE_LOCKINCLUDETEMPLATECLASSUNIQUE_LOCKPUBLICUNIQUE_LOCKEXPLICITUNIQUE_LOCKLOCKABLEUNIQUE_LOCKLOCKABLEUNIQUE_LOCKLOCKABLEUNIQUE_LOCKLOCKABLEUNIQUE_LOCKLOCKABLEUNIQUE_LOCKUNIQUE_LOCKDETAILTHREAD_MOVE_TOTHERUNIQUE_LOCKDETAILTHREAD_MOVE_TOTHEROPERATORDETAILTHREAD_MOVE_TDETAILTHREAD_MOVE_TMOVEUNIQUE_LOCKUNIQUE_LOCKVOIDSWAPUNIQUE_LOCKVOIDSWAPDETAILTHREAD_MOVE_TOTHERVOIDLOCKBOOLTRY_LOCKTEMPLATEBOOLTIMED_LOCKTIMEDURATIONCONSTBOOLTIMED_LOCKBOOSTSYSTEM_TIMECONSTVOIDUNLOCKBOOLOWNS_LOCKCONSTOPERATORUNSPECIFIEDBOOLTYPECONSTBOOLOPERATORCONSTLOCKABLEMUTEXCONSTLOCKABLERELEASEBOOSTUNIQUE_LOCK比BOOSTLOCK_GUARD复杂许多不仅是它提供RAII风格的外观,它也允许推迟获得锁定,直到LOCK函数显式调用,或者支持非阻塞方式获得锁定,或者是支持超时锁定。最后,析构函数在可锁定对象被其锁定的情况下调用UNLOCK函数。BOOSTUNIQUE_LOCK特化实现了TIMEDLOCKABLECONCEPT概念EGBOOSTUNIQUE_LOCK,或者LOCKABLECONCEPT概念EGBOOSTUNIQUE_LOCK。如果函数MUTEX返回指向的M指针并且OWNS_LOCK返回TRUE,该BOOSTUNIQUE_LOCK实例拥有一个可锁定对象的锁定状态。如果该种实例被销毁,析构函数会调用函数MUTEXUNLOCK。BOOSTUNIQUE_LOCK的成员函数不是线程安全的。特别的,BOOSTUNIQUE_LOCK是针对单一线程对可锁定对象所有权建立模型的,这样一个对象的成员函数(包含构造析构函数)必须在同一个线程内调用。基本上用于栈变量,不建议用于堆变量。SHARED_LOCKINCLUDETEMPLATECLASSSHARED_LOCKPUBLICSHARED_LOCKEXPLICITSHARED_LOCKLOCKABLESHARED_LOCKLOCKABLESHARED_LOCKLOCKABLESHARED_LOCKLOCKABLESHARED_LOCKLOCKABLESHARED_LOCKDETAILTHREAD_MOVE_TOTHERSHARED_LOCKDETAILTHREAD_MOVE_TOTHERSHARED_LOCKDETAILTHREAD_MOVE_TOTHERSHARED_LOCKOPERATORDETAILTHREAD_MOVE_TDETAILTHREAD_MOVE_TMOVESHARED_LOCKSHARED_LOCKSHARED_LOCKVOIDSWAPSHARED_LOCKVOIDLOCKBOOLTRY_LOCKBOOLTIMED_LOCKBOOSTSYSTEM_TIMECONSTVOIDUNLOCKOPERATORUNSPECIFIEDBOOLTYPECONSTBOOLOPERATORCONSTBOOLOWNS_LOCKCONSTBOOSTSHARED_LOCK对LOCKABLECONCEPT建模,但是不仅支持可锁定对象,还支持共享锁定获取。和BOOSTUNIQUE_LOCK一样,不仅提供RAII风格的外观,它也允许推迟获得锁定,直到LOCK函数显式调用,或者支持非阻塞方式获得锁定,或者是支持超时锁定。最后,析构函数在可锁定对象被其锁定的情况下调用UNLOCK函数。如果函数MUTEX返回指向的M指针并且OWNS_LOCK返回TRUE,该BOOSTSHARED_LOCK实例拥有一个可锁定对象的锁定状态。如果该种实例被销毁,析构函数会调用函数MUTEXUNLOCK。BOOSTSHARED_LOCK的成员函数不是线程安全的。特别的,BOOSTSHARED_LOCK是针对单一线程对可锁定对象所有权建立模型的,这样一个对象的成员函数(包含构造析构函数)必须在同一个线程内调用。UPGRADE_LOCKINCLUDETEMPLATECLASSUPGRADE_LOCKPUBLICEXPLICITUPGRADE_LOCKLOCKABLEUPGRADE_LOCKDETAILTHREAD_MOVE_TOTHERUPGRADE_LOCKDETAILTHREAD_MOVE_TOTHERUPGRADE_LOCKOPERATORDETAILTHREAD_MOVE_TDETAILTHREAD_MOVE_TMOVEUPGRADE_LOCKUPGRADE_LOCKVOIDSWAPUPGRADE_LOCKVOIDLOCKVOIDUNLOCKOPERATORUNSPECIFIEDBOOLTYPECONSTBOOLOPERATORCONSTBOOLOWNS_LOCKCONST和BOOSTUNIQUE_LOCK一样,BOOSTUPGRADE_LOCK对可锁定概念建模,但是不仅限于可锁定对提供的独占锁定,还支持可升级锁定。和BOOSTUNIQUE_LOCK一样,不仅提供RAII风格的外观,它也允许推迟获得锁定,直到LOCK函数显式调用,或者支持非阻塞方式获得锁定,或者是支持超时锁定。最后,析构函数在可锁定对象被其锁定的情况下调用UNLOCK函数。如果函数MUTEX返回指向的M指针并且OWNS_LOCK返回TRUE,该BOOSTUPGRADE_LOCK实例拥有一个可锁定对象的锁定状态。如果该种实例被销毁,析构函数会调用函数MUTEXUNLOCK。BOOSTUPGRADE_LOCK的成员函数不是线程安全的。特别的,BOOSTUPGRADE_LOCK是针对单一线程对可锁定对象所有权建立模型的,这样一个对象的成员函数(包含构造析构函数)必须在同一个线程内调用。UPGRADE_TO_UNIQUE_LOCKINCLUDETEMPLATECLASSUPGRADE_TO_UNIQUE_LOCKPUBLICEXPLICITUPGRADE_TO_UNIQUE_LOCKUPGRADE_LOCKUPGRADE_TO_UNIQUE_LOCKUPGRADE_TO_UNIQUE_LOCKDETAILTHREAD_MOVE_TOTHERUPGRADE_TO_UNIQUE_LOCKVOIDSWAPUPGRADE_TO_UNIQUE_LOCKOPERATORUNSPECIFIEDBOOLTYPECONSTBOOLOPERATORCONSTBOOLOWNS_LOCKCONSTBOOSTUPGRADE_TO_UNIQUE_LOCK允许临时从可升级锁定升级到独占锁定,如果传递BOOSTUPGRADE_LOCK对象的引用给构造函数,该对象将升级到独占所有权,当这个对象销毁时,可锁定对象恢复为可升级锁定。SCOPED_TRY_LOCKCLASSMUTEXTYPESCOPED_TRY_LOCKPRIVATEMUTEXTYPESCOPED_TRY_LOCKMUTEXTYPESCOPED_TRY_LOCKMUTEXTYPESCOPED_TRY_LOCKPUBLICMUTEXTYPESCOPED_TRY_LOCKEXPLICITMUTEXTYPESCOPED_TRY_LOCKMUTEXTYPEMUTEXTYPESCOPED_TRY_LOCKMUTEXTYPEMUTEXTYPESCOPED_TRY_LOCKMUTEXTYPEMUTEXTYPESCOPED_TRY_LOCKMUTEXTYPEMUTEXTYPESCOPED_TRY_LOCKMUTEXTYPESCOPED_TRY_LOCKMUTEXTYPESCOPED_TRY_LOCKVOIDSWAPMUTEXTYPESCOPED_TRY_LOCKVOIDLOCKBOOLTRY_LOCKVOIDUNLOCKBOOLOWNS_LOCKCONSTMUTEXTYPEMUTEXCONSTMUTEXTYPERELEASEBOOLOPERATORCONSTTYPEDEFUNSPECIFIEDBOOLTYPEBOOL_TYPEOPERATORBOOL_TYPECONST成员类型SCOPED_TRY_LOCK为已定义的不同的MUTEXTYPE提供了一个类型定义。其所有的函数与BOOSTUNIQUE_LOCK中的MUTEXTYPE类型的相同,除了带参数构造函数会调用MTRY_LOCK而不是调用MLOCK。锁定函数LOCKLOCKABLE1,LOCKABLE2,LOCKBEGIN,ENDTRY_LOCKLOCKABLE1,LOCKABLE2,TRY_LOCKBEGIN,END自由函数LOCKLOCKABLE1,LOCKABLE2,TEMPLATEVOIDLOCKLOCKABLE1TEMPLATEVOIDLOCKLOCKABLE1TEMPLATEVOIDLOCKLOCKABLE1TEMPLATEVOIDLOCKLOCKABLE1效果锁定参数提供的LOCKABLE对象,并避免死锁。该函数在多个线程并发调用锁定同一组互斥量(或其他可锁定对象)是安全的,并且不用指定锁定顺序,也不用担心死锁。如果函数在锁定对象时抛出异常,那么在函数退出前,该函数此次调用已锁定的对象也会被释放。抛出对可锁定对象加锁时可能抛出的异常。后置条件参数中提供的可锁定对象都被加锁。自由函数LOCKBEGIN,ENDTEMPLATEVOIDLOCKFORWARDITERATORBEGIN,FORWARDITERATOREND前置条件FORWARDITERATOR的VALUE_TYPE需要实现LOCKABLECONCEPT。效果锁定迭代区间的LOCKABLE对象,并避免死锁。该函数在多个线程并发调用锁定同一组互斥量(或其他可锁定对象)是安全的,并且不用指定锁定顺序,也不用担心死锁。如果函数在锁定对象时抛出异常,那么在函数退出前,该函数此次调用已锁定的对象也会被释放。抛出对可锁定对象加锁时可能抛出的异常。后置条件迭代区间中的可锁定对象都被加锁。自由函数TRY_LOCKLOCKABLE1,LOCKABLE2,。TEMPLATEINTTRY_LOCKLOCKABLE1TEMPLATEINTTRY_LOCKLOCKABLE1TEMPLATEINTTRY_LOCKLOCKABLE1TEMPLATEINTTRY_LOCKLOCKABLE1效果对参数中的可锁定对象依次调用TRY_LOCK函数,如果有一个TRY_LOCK调用返回FALSE,那么已经获得的锁定就会被释放,并返回这个锁定失败对象在参数中的序号(以0为基数)。如果有一个TRY_LOCK调用抛出异常,那么已经获得的锁定会在函数退出前释放。返回如果所有对象都成功加锁,返回1,否则返回第一个失败对象的序号(以0为基数)。抛出调用TRY_LOCK可能抛出的异常。后置条件如果函数返回1,所有对象都被加锁,否则参数中的对象都不会加锁。自由函数TRY_LOCKBEGIN,ENDTEMPLATEFORWARDITERATORTRY_LOCKFORWARDITERATORBEGIN,FORWARDITERATOREND前置条件FORWARDITERATOR的VALUE_TYPE需要实现LOCKABLECONCEPT。效果通过函数TRY_LOCK锁定迭代区间的LOCKABLE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现代教学网科普版课件
- 小学生教学课件绿色生活
- 大棚春节前施工方案
- 贵州缠绕钢带管施工方案
- 施工方案明细表
- 五月份工作总结与计划
- 涉案账户考核方案范本
- 贵州安全员证书考试题库及答案解析
- 事业编医疗护理综合知识题库及答案解析
- 安全生产前培训考试试题及答案解析
- 2025年第一届安康杯安全生产知识竞赛试题题库及答案(完整版)
- 电力工程冬季施工安全技术措施
- 贵州省贵阳市2026届高三上学期摸底考试数学试卷含答案
- 公司年度员工安全教育培训计划
- 潍坊市2026届高三开学调研监测考试化学试题及答案
- 供电所安全教育培训课件
- 2025年杭州市上城区望江街道办事处 编外人员招聘8人考试参考试题及答案解析
- 百果园水果知识培训资料课件
- 商业地产策划流程
- 2025年灌注桩考试题及答案
- 公司安全生产责任书范本
评论
0/150
提交评论