Boost.Thread

Boost.Thread允许在可移植的C ++代码中使用共享数据的多个执行线程。它提供了用于管理线程本身的类和函数,以及用于在线程之间同步数据或为单独线程提供单独数据副本的其他类。

boost::thread负责启动和管理线程。每个boost::thread对象表示一个单独的执行线程,或者说Not-a-Thread,最多一个 对象表示一个boost::thread给定的执行线程:类型的对象不可复制。 
类型的对象boost::thread是可移动的,但是,它们可以存储在移动感知容器中,并从函数返回。这允许线程创建的细节被封装在一个函数中。

boost::thread make_thread();
void f()
{
    boost::thread some_thread=make_thread();
    some_thread.join();
}

注意
在支持右值引用的编译器上,提供了合适的移动构造函数和移动赋值运算符,因此符合C ++ 0x MoveConstructible和MoveAssignable 概念。有了这样的编译器,就可以使用支持这些概念的容器。 boost::threadboost::thread
对于其他编译器,移动模拟层提供移动支持,因此容器必须明确检测移动模拟层。有关详细信息,请参阅<boost / thread / detail / move.hpp>。

启动线程
一个新的线程通过传递一个可调用类型的对象,可以不带参数调用给构造函数来启动。然后将该对象复制到内部存储器中,并在新创建的执行线程上调用。如果对象不能(或不能)被复制,则boost::ref  可以用来传入对函数对象的引用。在这种情况下,Boost.Thread的用户必须确保引用的对象超出新创建的执行线程。

struct callable
{
    void operator()();
};

boost::thread copies_are_safe()
{
    callable x;
    return boost::thread(x);
} // x is destroyed, but the newly-created thread has a copy, so this is OK


boost::thread oops()
{
    callable x;
    return boost::thread(boost::ref(x));
} // x is destroyed, but the newly-created thread still has a reference
  // this leads to undefined behaviour

如果你想要构造一个需要提供参数的函数或可调用对象的boost::thread实例,可以通过向boost::thread构造函数传递额外的参数来完成: 

void find_the_question(int the_answer);

boost::thread deep_thought_2(find_the_question,42);

参数被复制到内部线程结构中:如果需要引用,则使用boost::ref,就像对可调用函数的引用一样。 

对可传递的附加参数的数量有一个未指定的限制。

线程属性
以这种方式启动的线程是使用实现定义的线程属性创建的,如堆栈大小,调度,优先级...或任何特定于平台的属性。如何提供一个允许用户设置平台特定属性的便携式界面并不明显。Boost.Thread通过类的thread::attributes保留可选的方式上,允许至少以便携方式设置堆栈大小,如下所示:

boost::thread::attributes attrs;
attrs.set_stack_size(4096*10);
boost::thread deep_thought_2(attrs, find_the_question, 42);

即使对于这个简单的属性,也可能存在可移植的问题,因为一些平台可能要求堆栈大小应该具有最小尺寸和/或是给定页面大小的倍数。库调整请求的大小到平台约束,以便用户不需要照顾它。
这是以便携方式提供的单一属性。为了在施工时设置任何其他的线程属性,用户需要使用非可移植的代码
在PThread平台上,用户将需要获取线程属性句柄并将其用于任何属性。
接下来介绍用户如何在PThread平台上设置堆栈大小和调度策略。

boost::thread::attributes attrs;
// set portable attributes
// ...
attr.set_stack_size(4096*10);
#if defined(BOOST_THREAD_PLATFORM_WIN32)
    // ... window version
#elif defined(BOOST_THREAD_PLATFORM_PTHREAD)
    // ... pthread version
    pthread_attr_setschedpolicy(attr.native_handle(), SCHED_RR);
#else
#error "Boost threads unavailable on this platform"
#endif
boost::thread th(attrs, find_the_question, 42);

在Windows平台上,它不是那么简单,因为没有编译线程属性的类型。有一个链接到在Windows上创建一个线程,通过thread :: attributes类来模拟。这是LPSECURITY_ATTRIBUTES lpThreadAttributes。Boost.Thread提供了一个不可移植的set_security函数,以便用户可以在创建线程之前提供它,如下所示

#if defined(BOOST_THREAD_PLATFORM_WIN32)
  boost::thread::attributes attrs;
  // set portable attributes
  attr.set_stack_size(4096*10);
  // set non portable attribute
  LPSECURITY_ATTRIBUTES sec;
  // init sec 
  attr.set_security(sec);
  boost::thread th(attrs, find_the_question, 42);
  // Set other thread attributes using the native_handle_type.
  //...
#else
#error "Platform not supported"
#endif

线程函数中的异常
如果功能或传递给可调用对象的构造中传播时调用的boost::threadboost::thread_interrupted类型为不是异常,  std::terminate()被调用。

分离线程
一个线程可以通过显式调用对象 上的成员函数来分离。在这种情况下, 对象停止表示现在分离的线程,而代表 Not-a-Thread。 detach()boost::threadboost::thread

int main()
{
  boost::thread t(my_func);
  t.detach();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值