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的值,输出结果不变。
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; }
原文:https://www.cnblogs.com/tgcf/p/14780321.html