This question already has answers here:
Difference between pointer and reference as thread parameter

(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