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 }