- 传递类对象时:虽然线程入口采用引用接收,但并不是真实的引用,而是相当于值传递,要调用一次拷贝构造;只有在传参时加上std::ref()才是真实的引用
- 当加上std::ref()后,在子线程中修改buff.m_i,主线程中的buff.m_i也会一起变
#include <iostream>
#include <thread>
using namespace std;
class A
{
public:
int m_i;
A(int a) : m_i(a)
{
cout << "构造函数执行,地址为:" << this
<< " thread_ID: " << std::this_thread::get_id() << endl;
}
A(const A &a) : m_i(a.m_i)
{
cout << "拷贝构造函数执行,地址为:" << this
<< " thread_ID: " << std::this_thread::get_id() << endl;
}
~A()
{
cout << "析构函数执行,地址为:" << this
<< " thread_ID: " << std::this_thread::get_id() << endl;
}
};
void myprint(A &buff)
{
buff.m_i = 5;
cout << "子线程开始" << endl;
cout << "子线程参数地址是:" << &buff
<< " thread_ID: " << std::this_thread::get_id() << endl;
cout << "子线程 buff.m_i=" << buff.m_i << endl;
cout << "子线程结束" << endl;
}
int main()
{
cout << "主线程开始"
<< " thread_ID: " << std::this_thread::get_id() << endl;
int num = 2;
A myobj(num);
thread thread1(myprint,
std::ref(myobj));
thread1.join();
std::cout << "主线程 buff.m_i=" << myobj.m_i << std::endl;
cout << "主线程结束" << endl;
return 0;
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e312599a7c737345b34ad37cb61d4eb0.png)