文档章节

Boost库学习(2)thread 1

f4f
 f4f
发布于 2014/09/01 22:05
字数 634
阅读 97
收藏 0

多线程是大型程序的必需品,甚至是小程序也会需要多线程(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来说更底层一些,所以比较灵活,代码也会比较多。后面会有例子,所以这里就不详细介绍了。

© 著作权归作者所有

f4f

f4f

粉丝 1
博文 10
码字总数 8952
作品 0
武汉
项目经理
私信 提问
VS2015编译boost,并进行使用

1,到官网下载最新的boost,www.boost.org 这里我下载的1.68版本. 2,安装,解压后运行bootstrap.bat文件。稍等一小会就OK。 3,编译boost库。注意一定要使用VS2015的x64本机工具命令提示,这...

shzwork
02/14
21
0
Boost中的function和bind功能,实现Linux下线程类封装

最近在看陈硕的MUDUO网络通信库的过程中,发现作者大量使用了Boost::function以及Boost::bind功能,为了能够正常的学习作者的代码,决定先弄明白function以及bind的功能。 Boost::Function ...

西昆仑
2012/06/11
4.7K
8
arm交叉编译器编译boost库并调用

环境:ubuntu12.04 arm9 arm-none-linux-gnueabi-g++ 安装: 1. 确保ARM编译成功安装,并配置好环境变量。 2. 解压boost压缩包 3. 进入目录执行./bootstrap.sh, 此时形成bjam文件和project...

宁宁爸
2016/11/18
411
0
c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解

c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解 Boost是由C++标准委员会类库工作组成员发起,致力于为C++开发新的类库的组织。许多C++专家都投身于Boost线程库的开发中...

小星星程序员
2014/05/11
572
0
Linux下编译安装BOOST

标签: linux平台下要编译安装除gcc和gcc-c++之外,还需要两个开发库:bzip2-devel 和python-devel,因此在安装前应该先保证这两个库已经安装: #yum install gcc gcc-c++ bzip2 bzip2-devel...

crazy_charles
2017/05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
15分钟前
2
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
25分钟前
2
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
26分钟前
2
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
32分钟前
6
0
IDEA 自定义方法注解模板

IDEA 自定义方法注解模板 1、使用效果 /*** 计算交易费用* @Author wangjiafang* @Date 2019/9/11* @param feeComputeVo* @return*/@PostMapping("/v1/fee_compute")public ApiResp......

小白的成长
32分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部