zoukankan      html  css  js  c++  java
  • boost和std中的thread的引用参数

    boost 1.60.0

    先上代码:

     1 #include <boost/thread.hpp>
     2 #include <iostream>
     3 
     4 void add(int &i)
     5 {
     6     std::cout<<"in  add, befor ++i, i: "<<i<<std::endl;
     7     ++i;
     8     std::cout<<"in  add, after ++i, i: "<<i<<std::endl;
     9 }
    10 
    11 int main()
    12 {
    13     int i = 1;
    14     std::cout<<"in main, befor add, i: "<<i<<std::endl;
    15     boost::thread thre(add, i);
    16     thre.join();
    17     std::cout<<"in main, after add, i: "<<i<<std::endl;
    18     std::cin.get();
    19 }

    结果:

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

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

    将第15行代码改为

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

    后,输出:

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

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

    C++11

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

     1 #include <iostream>
     2 #include <thread>
     3 
     4 void add(int &i) {
     5     std::cout<<"in  add, befor ++i, i: "<<i<<std::endl;
     6     ++i;
     7     std::cout<<"in  add, after ++i, i: "<<i<<std::endl;
     8 }
     9 
    10 
    11 int main()
    12 {
    13     int i = 1;
    14     std::cout<<"in main, befor add, i: "<<i<<std::endl;
    15     auto func = std::bind(add, i);
    16     std::thread thre(func); // or std::thread thre(add, std::ref(i));
    17     thre.join();
    18     std::cout<<"in main, after add, i: "<<i<<std::endl;
    19     std::cin.get();
    20 }
  • 相关阅读:
    TP隐藏入口
    CentOs5.2中PHP的升级
    centos 关闭不使用的服务
    也不知怎么了LVS.SH找不到,网上搜了一篇环境搭配CENTOS下面的高可用 参考
    三台CentOS 5 Linux LVS 的DR 模式http负载均衡安装步骤
    分享Centos作为WEB服务器的防火墙规则
    Openssl生成根证书、服务器证书并签核证书
    生成apache证书(https应用)
    openssl生成https证书 (转)
    ls -l 列表信息详解
  • 原文地址:https://www.cnblogs.com/kohlrabi/p/6070062.html
Copyright © 2011-2022 走看看