【发布时间】:2019-12-17 00:53:10
【问题描述】:
我有 2 个使用 lambdas 创建的线程,在 lambdas 内部,我正在调用我的函数,我在其中操作我的全局变量。
我相信当我们不使用关键字 std::ref() 将值传递给线程内的函数时,即使函数参数是引用变量,它也会按值传递。但是在我的程序中,我希望 x、y、z 变量只打印 0、0、0,因为我没有使用 std::ref 传递变量,但它有时会打印 9、0、0,其他时候会打印 0、0、0 .我在这里错过了什么吗?
请在下面找到我的代码
我已经尝试执行下面的程序来测试我的输出
#include <stdio.h>
#include <iostream>
#include <thread>
using namespace std;
int x = 0;
int y = 0;
int z = 0;
void func(int& a, int& b)
{
for (int i = 0; i < 10000; ++i)
{
a += i;
b += i;
}
}
int main()
{
std::thread t1([]() {
func(x, z);
});
std::thread t2([]() {
func(y, z);
});
cout << "x,y,z=" << x << " " << y << " " << z << " " << endl;
t1.join();
t2.join();
getchar();
return 0;
}
【问题讨论】:
-
是什么让你认为
std::ref是pass by reference 的必要条件? -
另外:您可能希望在打印结果之前加入线程 - 否则线程可能还没有完成它们的工作。
-
不要通过引用传递给线程。如果您不能复制,请改为通过智能指针。
-
@SanderDeDycker 当我读到 std 线程时,它说通过我们将线程函数参数定义为 ref,它必须通过 std::ref 传递?对不对?
-
@VinayVinay :在某些情况下,您需要
std::ref(例如,当您想复制“参考”时),但在您的情况下不需要。您的 lambda 只是访问全局变量。即使他们会捕获变量,他们也可以只是captured by reference。更多内容请参考:C++ Difference between std::ref(T) and T&?.
标签: c++ multithreading c++11