This question already has answers here:
Difference between pointer and reference as thread parameter
(3个答案)
5年前关闭。
全部!我遇到了麻烦!函数“change”什么都不会改变...
因此,我编写了另一个程序来跟踪“a”和“&a”的地址。这是代码。
结果:
似乎函数“change”仅在我们作为线程运行时才起作用。
我想知道它是否与STACK有关?
有人可以给我一些赞美吗?非常感谢..这真的让我很痛苦T_T
(3个答案)
5年前关闭。
全部!我遇到了麻烦!函数“change”什么都不会改变...
void change(int &a){
cout << "thread tt \t" << &a << " value:" << a << endl;
a = 5;
return;
}
int main()
{
int a = 4;
cout << "Thread main \t" << &a << " value:" << a << endl;
thread tt(change, a);
tt.join();
cout << "After join() \t" << &a << " value:" << a << endl;
return 0;
}
因此,我编写了另一个程序来跟踪“a”和“&a”的地址。这是代码。
void change(int &a,int b){
cout << "thread change \t" << &a << " value:" << a << endl;
a = b;
return;
}
void change2(int *a,int b){
cout << "thread change2 \t" << &a << " value:" << a << endl;
*a = b;
return;
}
int main()
{
int a = 1;
change(a,2);
cout << &a << " " << a << endl;
change2(&a,3);
cout << &a << " " << a << endl;
cout << "Thread main \t" << &a << " value:" << a << endl<<endl;
thread t(change, a,4);
t.join();
cout << "After t.join()\t" << &a << " value:" << a << endl;
cout << &a << " " << a << endl << endl;
thread tt(change2, &a,5);
tt.join();
cout << "After tt.join()\t" << &a << " value:" << a << endl;
cout << &a << " " << a << endl << endl;
return 0;
}
结果:
thread change 0038FE98 value:1
0038FE98 2
thread change2 0038FD68 value:0038FE98
0038FE98 3
Thread main 0038FE98 value:3
thread change 0070FAF4 value:3
After t.join() 0038FE98 value:3
0038FE98 3
thread change2 00D0F99C value:0038FE98
After tt.join() 0038FE98 value:5
0038FE98 5
似乎函数“change”仅在我们作为线程运行时才起作用。
我想知道它是否与STACK有关?
有人可以给我一些赞美吗?非常感谢..这真的让我很痛苦T_T
最佳答案
您遇到的问题是std::thread没有通过引用获取a
。您可以将a
与 std::ref
包装在一起,以获得对线程函数的引用。
thread tt(change, std::ref(a));
关于c++ - 难以理解*和&,当它们带有线程时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31033238/
10-16 03:18