在5.3.2节的例子中,我通过一个非 const引用向线程传递参数。只有当希望任务有权修改引用所引的数据时,我才会这么做(见77节)。这种返回结果的方法有点不正规,但并不少见。一种不那么晦涩的技术是将输入数据以 const引用的方式传递,并将保存结果的内存地址作为第二个参数传递给线程。

    1. void f(const vector<double>& v,double* res); //从v获取输入,将结果放入*res
    2. class F
    3. {
    4. public:
    5. F(const vector<double>& vv,double* p):v{VV},res{p}{}
    6. void operator()(); //将结果放入/res
    7. private:
    8. const vector<double>& v; //输入源
    9. double* res;
    10. };
    11. int main()
    12. {
    13. vector<double> some_vec;
    14. vector<double> vec2;
    15. //...
    16. double res1;
    17. double res2;
    18. thread t1{f,some_vex,&res1}; //f(some_vec,&res1)在一个独立线程中执行
    19. thread t2{F{vec2,&res2}}; //F{vec2,&res2}()在一个独立线程中执行
    20. t1.join();
    21. t2.join();
    22. cout<<res1<<" "<<res2<<'\n';
    23. }

    我不认为通过参数返回结果是一种很优雅的方法。我们将在5.3.5.1节再次讨论这个问题。