Boost库学习(2)thread 1

多线程是大型程序的必需品,甚至是小程序也会需要多线程(GUI一个线程,业务逻辑一个线程)。
开线程方法1(boost::async):

#define BOOST_THREAD_VERSION 4
#include <boost/thread/future.hpp>
int p0();
int p1(int x);
class Test
{
    public:
        Test();
        static int print();
        int objprint(int x);
};
int main()
{
    boost::future<int> fi0(boost::async(p0));  //无参数函数
    boost::future<int> fi1(boost::async(boost::bind(p1,7)));  //有参数函数
    boost::future<int> fi2(boost::async(Test::print));  //类的静态函数
    Test test;
    boost::future<int> fi3(boost::async(boost::bind(&Test::objprint,&test,2)));  //对象的成员函数
    fi0.get();
    fi1.get();
    fi2.get();
    fi3.get();
}

async函数还有另一种形式,即第一个参数是起动方案(launch::async和launch::deferred),第二个参数是上例中的第一个参数。Boost的launch::deferred好像没有实现,我就用C++11的内容来说明一下。
  指定launch::async时,立即起动新的线程,并在新线程是执行第二个参数传入的函数,如果OS不支持则出异常。
  指定launch::deferred时,不开新线程,不执行第二个参数传入的函数,直到用户明确调用future<>.wait()或者future<>.get()。
  不指定起动方案时,优先使用launch::async,OS不支持时,采用launch::deferred。
future<>.wait():等到对应的函数执行完成,若新线程没有起动,则强行起动。
future<>.get():与future<>.wait()一样,最后返回函数的处理结果。函数的处理结果只能取得一次,第二次就取不到了。如果想多次读取处理结果,则需要调用future<>.share()取得shared_future<>类型变量,再用shared_future<>类型变量取处理结果。
future<>.wait_for()和future<>.wait_until():会等到函数执行完成或者TimeOut,最后返回一个状态(deferred,timeout或者ready)。这两个函数不会强制起动线程。
future<>类型的变量在销毁时,如果这个变量申明时指定的函数还没执行结束,会等到执行结束(相当于调用了wait函数)。
开线程方法2(boost::thread):
方法1在同步事件处理时很方便,但是如果作为一个消息接收线程就不合适了。(因为消息接收线程一般是需要有一个无限循环的,所有不能调用get或者wait函数,不然就永远卡在那里了。)
boost::thread的做法相对boost::async来说更底层一些,所以比较灵活,代码也会比较多。后面会有例子,所以这里就不详细介绍了。

你可能感兴趣的:(C++,boost)