c++ - 将参数传递给 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行有什么区别?哪些线是等价的?
我不是加入或分离线程,不是那个,而是传递函数参数的方式。
解决方案
t1
:
这只是将副本传递V
给线程。
t2
:
与 类似t1
,将 的副本V
传递给线程,但实际副本是在被调用线程而不是调用线程中生成的。这是一个重要的区别,因为应该V
在线程开始时更改或停止存在,您最终会得到不同的向量或未定义的行为。
t3
:
这应该无法编译,因为线程会将向量移动到 LValue 引用中,这应该是非法的。
t4
:
这通过引用线程来传递向量。V
当然,只要执行了适当的同步,对传递的引用的任何修改都将应用于。
推荐阅读
- mysql - 升级到 1.0 后无法升帆
- c# - asp.net上传文件License file not found错误
- php - PHP基本登录脚本不会登录
- javascript - 如何在具有循环结构的打字稿中复制primeNG树ByValue
- sql - 从一列时间表创建出勤视图 (SQL Server 2008 R2)
- excel - Excel导出所有文本内容
- php - 在php中成功连接表时不显示记录?
- python - Plotnine 中的误差线
- javascript - 使用 JavaScript 从离开站点警报中获取文本?
- android - Python程序(PC上的服务器)和android应用程序(使用android studios构建的客户端)之间的TCP套接字