我在这里使用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;
}
Run Code Online (Sandbox Code Playgroud)
另一个程序,在这种情况下,我也使用引用(&),但值已更改.为什么线程中的值没有改变?
void Func3(int &x)
{
x = x + 10;
}
int main() {
int n = 0;
Func3(n);
cout << “n = ” << n << endl; // n = 10
}
Run Code Online (Sandbox Code Playgroud)
该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));
Run Code Online (Sandbox Code Playgroud)
这会保持指针通过副本,并且只有在绑定引用参数时才会解析为实际目标.