首页 > 解决方案 > 将参数传递给 std::thread、C++ 的区别

问题描述

来自Nikolai Josuttis - 标准库 C++11的引用:

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

因此作者进一步解释说,即使您将引用作为函数参数传递给线程,它仍然按值传递,因此您必须用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行有什么区别?哪些线是等价的?
我不是加入或分离线程,不是那个,而是传递函数参数的方式。

标签: c++multithreadingc++11

解决方案


t1

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

t2

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

t3

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

t4

这通过引用线程来传递向量。V当然,只要执行了适当的同步,对传递的引用的任何修改都将应用于。


推荐阅读