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 }
  • 相关阅读:
    vector
    vector-back
    vector-back
    vector-begin
    vector-begin
    vector-at
    vector-at
    Vector-assign
    Vector-assign
    Vector-Constructors
  • 原文地址:https://www.cnblogs.com/kohlrabi/p/6070062.html
Copyright © 2011-2022 走看看