接着上一篇,在使用类封装线程时,遇到了这样一份代码
#include <thread>
#include <iostream>
using namespace std;
class TA{
public:
int &m_i;
TA(int &i):m_i(i){}
void operator()()
{
cout<<"m_i1的值为:"<<m_i<<endl;
cout<<"m_i2的值为:"<<m_i<<endl;
cout<<"m_i3的值为:"<<m_i<<endl;
cout<<"m_i4的值为:"<<m_i<<endl;
cout<<"m_i5的值为:"<<m_i<<endl;
}
};
int main()
{
int myi = 5;
TA ta(myi);
thread mytobj(ta);
mytobj.detach();
cout<<"这是主线程!"<<endl;
return 0;
}
这里有3个需要注意的点:
1,关于重载的()(),在另外一篇文章中可以看到这个的使用说明链接: 点这里.
2,多线程使用到了局部变量,而线程的加入方式是detach时,会造成不可预料的输出,代码需要修正传值不能使用引用。
3,多线程使用局部对象时,会将对象进行拷贝。
#include <thread>
#include <iostream>
using namespace std;
class TA{
public:
int m_i;
//
TA(int i) :m_i(i){
cout<<"TA()构造函数"<<endl;
}
TA(const TA &ta) :m_i(ta.m_i){
cout<<"TA()拷贝构造函数"<<endl;
}
~TA(){
cout<<"TA()拷贝构造函数"<<endl;
}
void operator()()
{
cout<<"m_i1的值为:"<<m_i<<endl;
cout<<"m_i2的值为:"<<m_i<<endl;
cout<<"m_i3的值为:"<<m_i<<endl;
cout<<"m_i4的值为:"<<m_i<<endl;
cout<<"m_i5的值为:"<<m_i<<endl;
}
};
int main()
{
int myi = 100;
TA ta(myi);
thread mytobj(ta);
mytobj.detach();
cout<<"这是主线程"<<endl;
return 0;
}
看代码的时候遇到了两个问题:
函数中使用 const ,它的作用呢,参考下面的链接,链接: link.,作用就是认为传入的参数是不可以修改的,那么编译器就可以对其进行优化
然后就是ref的使用,std::ref
具体使用可以看这个,链接: 点这个.
这个实在函数模板里传参数时用到,实际效果类似与引用,但是使用方式有区别。