我在这里使用Reference(&),但是a没有改变。为什么? 当我使用指针(*)时,值已经改变。
int all=0;
void call_from_thread(int & a)
{
a = 5;
}
int main()
{
thread s = thread(call_from_thread, all);
s.join();
return 0;
}
另一个程序,在这种情况下,我也使用Reference(&),但值已经改变。为什么线程中的值没有改变?
void Func3(int &x)
{
x = x + 10;
}
int main() {
int n = 0;
Func3(n);
cout << “n = ” << n << endl; // n = 10
}
答案 0 :(得分:7)
std::thread
构造函数在线程创建步骤中复制其参数....普通引用不会在行程中存活,call_from_thread
函数会接收对副本的引用。
详细信息可在标准中找到。 thread::thread
构造函数行为被描述为
构造一个thread类型的对象。新的执行线程执行
INVOKE(DECAY_COPY(std::forward<F>(f)), DECAY_COPY(std::forward<Args>(args))...)
调用DECAY_COPY
在构造线程中进行评估。
DECAY_COPY
的确切定义非常复杂,但顾名思义,它会忽略引用并制作值副本。
一个简单的解决方法是使用std::ref
。
thread s = thread(call_from_thread, std::ref(all));
这会保留指向副本的指针,并且仅在绑定引用参数时解析为实际目标。