多线程是大型程序的必需品,甚至是小程序也会需要多线程(GUI一个线程,业务逻辑一个线程)。
开线程方法1(boost::async):#define BOOST_THREAD_VERSION 4#includeint p0();int p1(int x);class Test{ public: Test(); static int print(); int objprint(int x);};int main(){ boost::future fi0(boost::async(p0)); //无参数函数 boost::future fi1(boost::async(boost::bind(p1,7))); //有参数函数 boost::future fi2(boost::async(Test::print)); //类的静态函数 Test test; boost::future 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来说更底层一些,所以比较灵活,代码也会比较多。后面会有例子,所以这里就不详细介绍了。