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; 
}

 

posted on 2021-05-24 13:36  天官赐福  阅读(116)  评论(0)    收藏  举报