boost 1.60.0

先上代码:

 #include <boost/thread.hpp>
#include <iostream> void add(int &i)
{
std::cout<<"in add, befor ++i, i: "<<i<<std::endl;
++i;
std::cout<<"in add, after ++i, i: "<<i<<std::endl;
} int main()
{
int i = ;
std::cout<<"in main, befor add, i: "<<i<<std::endl;
boost::thread thre(add, i);
thre.join();
std::cout<<"in main, after add, i: "<<i<<std::endl;
std::cin.get();
}

结果:

in main, befor add, i:
in add, befor ++i, i:
in add, after ++i, i:
in main, after add, i:

可以看到虽然函数形参是引用方式,但线程并没有改变主函数中的变量。

将第15行代码改为

 boost::thread thre(add, boost::ref(i));

后,输出:

in main, befor add, i:
in add, befor ++i, i:
in add, after ++i, i:
in main, after add, i:

可以推测:thread启动函数时,使用和bind一样的方式进行参数绑定。虽然形参是引用方式,但是如果不使用ref(),结果依然是值传递。

C++11

而在C++ std中,前一种调用方式会引发编译错误。如果确实有这种需求,可以借助bind函数:

 #include <iostream>
#include <thread> void add(int &i) {
std::cout<<"in add, befor ++i, i: "<<i<<std::endl;
++i;
std::cout<<"in add, after ++i, i: "<<i<<std::endl;
} int main()
{
int i = ;
std::cout<<"in main, befor add, i: "<<i<<std::endl;
auto func = std::bind(add, i);
std::thread thre(func); // or std::thread thre(add, std::ref(i));
thre.join();
std::cout<<"in main, after add, i: "<<i<<std::endl;
std::cin.get();
}

boost和std中的thread的引用参数的更多相关文章

  1. thread - 传递引用参数

    当给 thread 的执行函数传递指针参数时,没有任何问题,但是如果想传递引用,按照普通函数的调用方法会遇到编译失败: #include <iostream> #include <t ...

  2. C++11中std::move、std::forward、左右值引用、移动构造函数的测试

    关于C++11新特性之std::move.std::forward.左右值引用网上资料已经很多了,我主要针对测试性能做一个测试,梳理一下这些逻辑,首先,左值比较熟悉,右值就是临时变量,意味着使用一次就 ...

  3. C++ 11 中的右值引用

    C++ 11 中的右值引用 右值引用的功能 首先,我并不介绍什么是右值引用,而是以一个例子里来介绍一下右值引用的功能: #include <iostream>    #include &l ...

  4. [转载] C++11中的右值引用

    C++11中的右值引用 May 18, 2015 移动构造函数 C++98中的左值和右值 C++11右值引用和移动语义 强制移动语义std::move() 右值引用和右值的关系 完美转发 引用折叠推导 ...

  5. Item 25: 对右值引用使用std::move,对universal引用则使用std::forward

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 右值引用只能绑定那些有资格被move的对象上去.如 ...

  6. 在Activity中使用Thread导致的内存泄漏

    https://github.com/bboyfeiyu/android-tech-frontier/tree/master/issue-7/%E5%9C%A8Activity%E4%B8%AD%E4 ...

  7. Java中的四种引用

    引用定义 实际上,Java中存在四种引用,它们由强到弱依次是:强引用.软引用.弱引用.虚引用.下面我们简单介绍下这四种引用: 强引用(Strong Reference):通常我们通过new来创建一个新 ...

  8. 谈谈 C++ 中的右值引用

    转自:https://liam0205.me/2016/12/11/rvalue-reference-in-Cpp/ 最近在改 XGBoost 的代码.XGBoost 在代码中使用了很多来自 C++1 ...

  9. std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题

    在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...

随机推荐

  1. gulp与webpack-stream集成配置

    webpack非常强大,但是也有不足的地方,批量式处理依然是gulp更胜一筹.我们是否可以将两者的优点结合起来呢? 这篇文章就是讲述如何集成gulp和webpack 1.安装webpack-strea ...

  2. PHP data

  3. iOS开发 个别页面是否支持页面旋转

    - (BOOL)shouldAutorotate { return YES; }

  4. Gevent中的同步与异步详解

    同步,异步概念 1.同步就是发生调用时,一定等待结果返回,整个调用才结束: 2.异步就是发生调用后,立即返回,不等待结果返回.被调用者通过状态.通知来通知调用者,或通过回调函数处理这个调用. 查询 1 ...

  5. CentOS 安装 lamp(转)

    一般情况下,安装的都是最新的正式版,除非你有特殊需求,要安装指定的版本,本文暂不讨论.从最基础的开始,一点点完成一个可用的 Linux 主机.这里就开始介绍如何在 CentOS 6.0 上安装 LAM ...

  6. java: Runtime和Process调用本机程序

    java: Runtime和Process调用本机程序 调用纸牌程序,Process用来销毁程序 import java.io.IOException; public class RunTimeDem ...

  7. 哈希表(Hash Table)

    参考: Hash table - Wiki Hash table_百度百科 从头到尾彻底解析Hash表算法 谈谈 Hash Table 我们身边的哈希,最常见的就是perl和python里面的字典了, ...

  8. ToolBar 修改边距

    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android ...

  9. 【java项目小记--JManager】项目开始原因及github部署

    --记于2016-8-11 毕业已三载,忽然想起大学时的毕业设计项目,想到曾在毕业答辩上说,会吸取老师点评并逐渐完善该项目.而今 老师点评已忘了个干净,项目也还是毕业时的样子,正好最近有些时间,打算兑 ...

  10. SPSS数据分析—基于最优尺度变换的典型相关分析

    传统的典型相关分析只能考虑变量之间的线性相关情况,且必须为连续变量,而我们依然可以使用最优尺度变换来拓展其应用范围,使其可以分析非线性相关.数据为分类数据等情况,并且不再仅限于两个变量间的分析, 虽然 ...