Boost::Thread 多线程的基础知识

Boost.Thread可使用多线程执行可移植C++代码中的共享数据。它提供了一些类和函数来管理线程自己,还有其它一些为了实如今线程之间同步数据或者提供针对特定单个线程的数据拷贝。
头文件:
#include <boost/thread.hpp>多线程

线程定义
boost::thread 类是负责启动和管理线程。每一个boost::thread对象表明一个单独的执行线程,是不可拷贝的。因为它是能够被移动到,因此它们能够被保存到会改变大小的容器中,而且从函数返回。这使得线程建立的详细信息能够被封装到一个函数中。
boost::thread make_thread();函数

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


启动线程
一个新的线程能够经过传递一个可被调用的类型对象来启动,这个对象能够不须要给构造器参数就被唤醒。对象被拷贝到内存,而且在最新建立的线程上唤醒。若是对象不能被拷贝,boost::ref能够以引用的方式来传递给函数对象。在这种状况下,用户的boost.thread必须确保对象的引用的生命期必须比最新建立的执行线程要长。this

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 OKrest

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 的实例须要提供一些参数,这些能够经过给它的构造体传递另外的参数来办到。内存

void find_the_question(int the_answer);get

boost::thread deep_thought_2(find_the_question,42);
参数被拷贝到内部线程结构里:若是须要传递一个引用,可使用boost::Ref,只是对可调用对象的引用。
没有指定限制传递的额外参数的数量。同步

线程中的异常
若是传入到boost::thread构造体的函数或者可调用的对象抛出了一个异常并且唤醒它的不是boosst::thread_interrupted类型,std::terminate()会被调用来结束这个线程。

等待
当表明一个执行线程的线程对象被破坏时,这个线程变成分离的,一旦它被分离,将会继续执行知道唤醒由构造体提供的函数或者可调用对象执行结束,或者程序已经结束。线程也能够经过调用detach()成员函数来显示的分离。在这种情形下,线程对象将不在表示一个当前分离的线程,而是一个非线程体。
为了等待一个线程执行完毕,必须使用join()和timed_join()成员函数。join()会阻塞调用的线程直到线程结束。若是线程刚刚执行结束,或者它已经不表明一个线程,join()会当即返回。timed_join()也是相似的,可是调用它若是在指定的时间流逝后线程仍然没有结束它也会返回。

中断
一个正在运行的线程能够经过调用相应的boost::thread对象的interrupt()成员函数来中断。当被中断的线程在下次执行一个指定的中断点(或者若是它在同时执行一个的时候被锁)并开启中断时,在被中断的线程中就会抛出一个boost::thread_interrupted异常。若是没有被捕获,这会致使结束被中断线程的执行。与其余异常同样,栈就会被释放,自动存储期对象的析构体将会被执行。
若是一个线程须要避免被中断,能够建立一个boost::this_thread::disable_interruption实例。这个类的对象在构造体建立线程的时候禁止了中断,能够在析构体调用以前的任意地方恢复容许中断。
void f()
{
    // interruption enabled here
    {
        boost::this_thread::disable_interruption di;
        // interruption disabled
        {
            boost::this_thread::disable_interruption di2;
            // interruption still disabled
        } // di2 destroyed, interruption state restored
        // interruption still disabled
    } // di destroyed, interruption state restored
    // interruption now enabled
}

经过构造一个boost::this_thread::restore_interruption实例能够临时转换一个boost::this_thread::disable_interruption实例形成的影响,只要在有问题的地方传递一个boost::this_thread::disable_interruption对象。这会从新恢复中断状态到当boost::this_thread_diable_interruption对象被构造时,而且在次禁止中断当boost::this_thread::restore_interruption对象被破坏时。
void g()
{
    // interruption enabled here
    {
        boost::this_thread::disable_interruption di;
        // interruption disabled
        {
            boost::this_thread::restore_interruption ri(di);
            // interruption now enabled
        } // ri destroyed, interruption disable again
    } // di destroyed, interruption state restored
    // interruption now enabled
}
咱们能够经过调用boost::this_thread::interruption_enabled()来查询中断的状态。


预约义的中断点
如下函数当容许中断时可能会抛出boost::thread_interrupted异常。
boost::thread::join() 
boost::thread::timed_join() 
boost::condition_variable::wait() 
boost::condition_variable::timed_wait() 
boost::condition_variable_any::wait() 
boost::condition_variable_any::timed_wait() 
boost::thread::sleep() 
boost::this_thread::sleep() 
boost::this_thread::interruption_point()

线程IDboost::thread::id类能够用来标识一个线程。每一个运行的执行线程都有一个特有的ID,能够经过对应的boost::thread的get_id()成员函数来得到ID。

相关文章
相关标签/搜索