将参数传递给std :: thread,C ++的区别

时间:2018-05-21 16:00:19

标签: c++ multithreading c++11

来自Nikolai Josuttis - Standard Library C++11的quiote:

  

如果使用非本地资源,分离的线程很容易成为问题。问题是   你失去了对分离线程的控制,并且没有简单的方法来确定它是否运行以及运行多长时间。   因此,请确保分离的线程在其生命周期结束后不访问任何对象。对于   这个原因,通过引用将变量和对象传递给线程始终是一种风险。传递参数   强烈建议按值。

作者进一步解释说,即使您将引用作为函数参数传递给线程,它仍然按值传递,因此您必须使用std::ref指示引用。

我有这些问题,请参阅以下代码:

void f(std::vector<int> V){...}
void g(std::vector<int>& V){...}

std::vector<int> V;

std::thread t1(f, V);
std::thread t2(f, std::ref(V));
std::thread t3(g, V);
std::thread t4(g, std::ref(V));

这4行有什么不同?哪条线是等价的?
我没有加入或分离线程,它不是关于那个,它是关于传递函数参数的方式。

1 个答案:

答案 0 :(得分:5)

t1

这只是将V的副本传递给线程。

t2

t1类似,V的副本传递给线程,但实际的副本是在被调用的线程而不是调用者线程中进行的。这是一个重要的区别,因为在线程开始时V应该被更改或停止存在,您将最终得到不同的向量或未定义的行为。

t3

这应该无法编译,因为线程将向量移动到LValue引用中,这应该是非法的。

t4

这通过引用传递向量。对传递的引用的任何修改都将应用于V