博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Boost库学习(2)thread 1
阅读量:6272 次
发布时间:2019-06-22

本文共 1580 字,大约阅读时间需要 5 分钟。

hot3.png

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

开线程方法1(boost::async):

#define BOOST_THREAD_VERSION 4#include 
int 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来说更底层一些,所以比较灵活,代码也会比较多。后面会有例子,所以这里就不详细介绍了。

转载于:https://my.oschina.net/u/2002913/blog/308889

你可能感兴趣的文章
索引失效 ORA-01502
查看>>
Oracle取月份,不带前面的0
查看>>
Linux Network Device Name issue
查看>>
IP地址的划分实例解答
查看>>
如何查看Linux命令源码
查看>>
运维基础命令
查看>>
Linux下的lds链接脚本简介(二)
查看>>
入门到进阶React
查看>>
C++每日练笔之日期类(基类)
查看>>
SVN 命令笔记
查看>>
修复Postfix 的Relay access denied问题
查看>>
检验手机号码
查看>>
重叠(Overlapped)IO模型
查看>>
ffmpeg study 1
查看>>
Git使用教程
查看>>
使用shell脚本自动监控后台进程,并能自动重启
查看>>
Flex&Bison手册
查看>>
MySQL 5.6 for Windows 解压缩版配置安装
查看>>
solrCloud+tomcat+zookeeper集群配置
查看>>
/etc/fstab,/etc/mtab,和 /proc/mounts
查看>>