2.2 传递参数给线程函数
传递参数给线程函数
void f(int i, string s) { for (size_t per = 0; per < i; per++) { cout << per << "-" << s[per] << endl; } } int main() { std::string s = "hello"; int s_length = s.length(); std::thread t(f, s_length, s); // f为与线程t绑定的函数, s_length为f函数的第一个参数,s为f函数的第二个参数
t.join();
cout << s.c_str() << endl; // 打印字符串s
system("pause");
return 0;
}
输出结果:
通过引用传递参数
修改f函数的第二个参数为引用,并在函数内修改s的值,输出结果不变。虽然f函数的第二个参数是引用,但实际是值传递,是被复制到子线程中的;但是如果将string对象写成是char指针,则子线程中的指针指向与主线程中变量同一地址,子线程中修改内存值后,主线程中变量值也被修改。
void f(int i, string& s) { for (size_t per = 0; per < i; per++) { cout << per << "-" << s[per] << endl; } s = "finish"; // 修改字符串s的值 }
输出结果(字符串s未修改):
正确传入引用的方式:
void f(int i, string& s) // 这里也必须是引用类型 { for (size_t per = 0; per < i; per++) { cout << per << "-" << s[per] << endl; } } int main() { std::string s = "hello"; int s_length = s.length(); std::thread t(f, s_length, std::ref(s)); // std::ref来包装需要被引用的参数 t.join(); cout << s.c_str() << endl; // 打印字符串s system("pause"); return 0; }
输出结果(字符串s已修改):
线程绑定类的成员函数
class X { public: void do_lengthy_work(int i, string s); }; int main() { std::string s = "hello"; int s_length = s.length(); X my_x; /* &X::do_lengthy_work:成员函数的函数指针; * &my_x:对象指针; * s_length与s为传递给函数do_lengthy_work的两个参数 */ std::thread t(&X::do_lengthy_work, &my_x, s_length, s); t.join(); return 0; }