C++11多线程中引用传递参数时,不能直接写变量,因为这实际上进行的是值传递,尽管你在定义函数时使用了&来希望是引用传递。
通常,线程中引用传递有两种方法:
1. std::ref(s)
2. std::move(s)。 不建议,因为运行后,该对象S会在后面就无法使用了。
另外,需要补充的是,线程在创建时,既可以传递函数,也可以传递仿函数(Functor),但在传递仿函数functor时,要注意传参时,应传: (functor()).
具体可参见以下代码:
#ifndef MAIN_CPP
#include<iostream>
#include<thread>
#include<stdlib.h> //EXIT_SUCCESS
#include <stdio.h> // system(“pause”);
#include<string>
#include "factor.h"
using namespace std;
void func();
void factor01::operator()(const string& s) {
func();
cout << "print s=" <<s<< endl;
}
void func() {
cout << "www.baidu.com" << endl;
}
int main() {
factor01 f1;
//thread t1(f1);
//thread t1((factor01()));
const string s="I love China!";
thread t2((factor01()), std::move(s)); // 引用传递给线程时,有两种方法:1)std::ref(s) 2) std::move(s) -> in POIX, 引用必须用以上进行传参,否则就是值传递。
try {
}
catch (...)//all exceptions
{
t2.join();
throw;
}
//t1.join();
if(t2.joinable())
t2.join();
system("pause");
return EXIT_SUCCESS;
}
#endif // !1
dd