boost作偷窃引号的用法及举例,请举例

Boost意思是_百度知道
Boost意思是
偷窃,增加; 向上推起boost[英][ 吹捧; vi.宣扬,提高; n.提高; 帮助; 吹捧; 增加:st][美][bust] [美国俚语](尤指在商店)行窃.促进; 加速[助推]器
来自团队:
其他类似问题
为您推荐:
其他1条回答
宣扬,宣扬
相关短语be in low&#47.动词意思是提高;high boost,促进1,增加.名词意思是帮助,支援,偷窃2
boost的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁7983人阅读
除了thread,boost::thread另一个重要组成部分是mutex,以及工作在mutex上的boost::mutex::scoped_lock、condition和barrier,这些都是为实现线程同步提供的。
boost提供的mutex有<span style="color:#种:
boost::mutex
boost::try_mutex
boost::timed_mutex
boost::recursive_mutex
boost::recursive_try_mutex
boost::recursive_timed_mutex
下面仅对boost::mutex进行分析。
mutex类是一个CriticalSection(临界区)封装类,它在构造函数中新建一个临界区并InitializeCriticalSection,然后用一个成员变量
void* m_mutex;
来保存该临界区结构。
除此之外,mutex还提供了do_lock、do_unlock等方法,这些方法分别调用EnterCriticalSection、 LeaveCriticalSection来修改成员变量m_mutex(CRITICAL_SECTION结构指针)的状态,但这些方法都是private的,以防止我们直接对mutex进行锁操作,所有的锁操作都必须通过mutex的友元类detail::thread::lock_ops&mutex&来完成,比较有意思的是,lock_ops的所有方法:lock、unlock、trylock等都是static的,如lock_ops&Mutex&::lock的实现:
<span style="color:# template
&typename Mutex&
<span style="color:# class lock_ops :
private noncopyable
<span style="color:# {
<span style="color:#
<span style="color:# public:
<span style="color:# &&&&static
void lock(Mutex& m)
<span style="color:# &&&& {
<span style="color:# &&&&&&&& m.do_lock();
<span style="color:# &&&& }
<span style="color:#
<span style="color:# }
boost::thread的设计者为什么会这么设计呢?我想大概是:
1、boost::thread的设计者不希望被我们直接操作mutex,改变其状态,所以mutex的所有方法都是private的(除了构造函数,析构函数)。
2、虽然我们可以通过lock_ops来修改mutex的状态,如:
<span style="color:# #include
&boost/thread/thread.hpp&
<span style="color:# #include
&boost/thread/mutex.hpp&
<span style="color:# #include
&boost/thread/detail/lock.hpp&
<span style="color:#
<span style="color:# int main()
<span style="color:# {
<span style="color:# &&&& boost::
<span style="color:# &&&&//mt.do_lock();&&&&&&&&// Error! Can not
access private member!
<span style="color:#
<span style="color:# &&&& boost::detail::thread::lock_ops&boost::mutex&::lock(mt);
<span style="color:#
<span style="color:# &&&&return
<span style="color:#;
<span style="color:# }
但是,这是不推荐的,因为mutex、scoped_lock、condition、barrier是一套完整的类系,它们是相互协同工作的,像上面这么操作没有办法与后面的几个类协同工作。
scoped_lock
上面说过,不应该直接用lock_ops来操作mutex对象,那么,应该用什么呢?答案就是scoped_lock。与存在多种mutex一样,存在多种与mutex对应的scoped_lock:
scoped_lock
scoped_try_lock
scoped_timed_lock
这里我们只讨论scoped_lock。
scoped_lock是定义在namespace boost::detail::thread下的,为了方便我们使用(也为了方便设计者),mutex使用了下面的typedef:
typedef detail::thread::scoped_lock&mutex&
scoped_lock;
这样我们就可以通过:
boost::mutex::scoped_lock
来使用scoped_lock类模板了。
由于scoped_lock的作用仅在于对mutex加锁/解锁(即使mutex EnterCriticalSection/LeaveCriticalSection),因此,它的接口也很简单,除了构造函数外,仅有lock/unlock/locked(判断是否已加锁),及类型转换操作符void*,一般我们不需要显式调用这些方法,因为scoped_lock的构造函数是这样定义的:
<span style="color:# explicit scoped_lock(Mutex& mx, bool initially_locked=true)
<span style="color:# &&&& : m_mutex(mx), m_locked(false)
<span style="color:# {
<span style="color:# &&&&if (initially_locked) lock();
<span style="color:# }
注:m_mutex是一个mutex的引用。
因此,当我们不指定initially_locked参数构造一个scoped_lock对象时,scoped_lock会自动对所绑定的mutex加锁,而析构函数会检查是否加锁,若已加锁,则解锁;当然,有些情况下,我们可能不需要构造时自动加锁,这样就需要自己调用lock方法。后面的condition、barrier也会调用scoped_lock的lock、unlock方法来实现部分方法。
正因为scoped_lock具有可在构造时加锁,析构时解锁的特性,我们经常会使用局部变量来实现对mutex的独占访问。
<span style="color:# #include
&boost/thread/thread.hpp&
<span style="color:# #include
&boost/thread/mutex.hpp&
<span style="color:# #include
&iostream&
<span style="color:#
<span style="color:# boost::mutex io_
<span style="color:#
<span style="color:# void count()&&&&// worker function
<span style="color:# {
<span style="color:# &&&&for (int i
= <span style="color:#; i
& <span style="color:#;
&#43;&#43;i)
<span style="color:# &&&& {
<span style="color:# &&&&&&&& boost::mutex::scoped_lock lock(io_mutex);
<span style="color:# &&&&&&&& std::cout
<span style="color:# &&&& }
<span style="color:# }
<span style="color:#
<span style="color:# int main(int argc,
char* argv[])
<span style="color:# {
<span style="color:# &&&& boost::thread thrd1(&count);
<span style="color:# &&&& boost::thread thrd2(&count);
<span style="color:# &&&& thrd1.join();
<span style="color:# &&&& thrd2.join();
<span style="color:#
<span style="color:# &&&&return
<span style="color:#;
<span style="color:# }
在每次输出信息时,为了防止整个输出过程被其它线程打乱,通过对io_mutex加锁(进入临界区),从而保证了输出的正确性。
在使用 scoped_lock时,我们有时候需要使用全局锁(定义一个全局mutex,当需要独占访问全局资源时,以该全局mutex为参数构造一个 scoped_lock对象即可。全局mutex可以是全局变量,也可以是类的静态方法等),有时候则需要使用对象锁(将mutex定义成类的成员变量),应该根据需要进行合理选择。
Java的synchronized可用于对方法加锁,对代码段加锁,对对象加锁,对类加锁(仍然是对象级的),这几种加锁方式都可以通过上面讲的对象锁来模拟;相反,在Java中实现全局锁好像有点麻烦,必须将请求封装到类中,以转换成上面的四种 synchronized形式之一。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:53283次
排名:千里之外
转载:29篇
(3)(2)(1)(1)(1)(1)(1)(4)(2)(5)(15)(2)推荐这篇日记的豆列
······c++ tr1和Boost中,tuple、tie的用法。 | 四号程序员
在c++ 98标准的STL中,只有一个pair&T1, T2&可以容纳两个不同的类型。
我们知道在Python中,有一种tuple,可以把任意多类型的不同数据组成一组tuple,如今的tr1标准,也支持这种数据结构啦!!
Boost中的tuple
这个是从Boost中完全采纳的,所以先看Boost用法:
boost::tuple & std::string, int, double & ta("str", 10, 5.5);
boost::tuple & std::string, int, double & ta("str", 10, 5.5);
获取tuple的第几个元素:
ta.get&0&()
ta.get&0&()
#include &boost/tuple/tuple.hpp&
#include &string&
#include &iostream&
int main()
boost::tuple & std::string, int, double & ta("str", 10, 5.5);
std::cout && ta.get&0&() && std::
std::cout && ta.get&1&() && std::
std::cout && ta.get&2&() && std::
123456789101112
#include &boost/tuple/tuple.hpp&#include &string&#include &iostream&&int main(){&&&&boost::tuple & std::string, int, double & ta("str", 10, 5.5);&&&&std::cout && ta.get&0&() && std::endl;&&&&std::cout && ta.get&1&() && std::endl;&&&&std::cout && ta.get&2&() && std::endl;&&&&return 0;}
tr1中的用法
然后再来看看标准tr1的用法,在get的时候略有不同。
#include &tr1/tuple&
#include &string&
#include &iostream&
int main()
std::tr1::tuple& std::string, int, double & ta("str", 10, 5.5);
std::cout && std::tr1::get&0&(ta) && std::
std::cout && std::tr1::get&1&(ta) && std::
std::cout && std::tr1::get&2&(ta) && std::
123456789101112
#include &tr1/tuple&#include &string&#include &iostream&&int main(){&&&&std::tr1::tuple& std::string, int, double & ta("str", 10, 5.5);&&&&std::cout && std::tr1::get&0&(ta) && std::endl;&&&&std::cout && std::tr1::get&1&(ta) && std::endl;&&&&std::cout && std::tr1::get&2&(ta) && std::endl;&&&&return 0;}
tie用于unpack
此外,tuple还提供了一个tie函数,用于unpack之:
#include &tr1/tuple&
#include &string&
#include &iostream&
int main()
std::tr1::tuple& std::string, int, double & ta("str", 10, 5.5);
// use 'tie' to unpack
std::string str_1;
int int_2;
double double_3;
std::tr1::tie(str_1, int_2, double_3) =
std::cout && str_1 && std::
std::cout && int_2 && std::
std::cout && double_3 && std::
1234567891011121314151617
#include &tr1/tuple&#include &string&#include &iostream&&int main(){&&&&std::tr1::tuple& std::string, int, double & ta("str", 10, 5.5);&&&&// use 'tie' to unpack&&&&std::string str_1;&&&&int int_2;&&&&double double_3;&&&&std::tr1::tie(str_1, int_2, double_3) = ta;&&&&std::cout && str_1 && std::endl;&&&&std::cout && int_2 && std::endl;&&&&std::cout && double_3 && std::endl;&&&&return 0;}
您可能也喜欢如下文章:
This entry was posted in
Click the right image To submit your comment:
Categories
Insert/edit link
Enter the destination URL
& Open link in a new tab
No search term specified. Showing recent items.
Search or use up and down arrow keys to select an item.

我要回帖

更多关于 双引号的用法及举例 的文章

 

随机推荐