线程传参,detach坑和成员函数作为线程函数
【摘要】 1.传递临时对象作为线程参数class A{public: A(int a) :m_i(a) { cout << "A::A(int a)构造函数执行" << this << endl; } A(const A& a) { cout << "A::A(const A)拷贝构造函数执行" << this << endl; } ~A() { cout << "~A::A()析构函数执行" <<...
1.传递临时对象作为线程参数
class A
{
public:
A(int a) :m_i(a) { cout << "A::A(int a)构造函数执行" << this << endl; }
A(const A& a) { cout << "A::A(const A)拷贝构造函数执行" << this << endl; }
~A() { cout << "~A::A()析构函数执行" << this << endl; }
int m_i;
};
void myprint(int i, const A& pmybuf)
{
cout << &pmybuf << endl; //这里打印pmybuf地址
return;
}
int main()
{
int mvar = 1;
int mysecondpar = 12;
std::thread mytobj(myprint, mvar, A(mysecondpar));
mytobj.join();
cout << "主函数执行结束" << endl;
}
void myprint(int i, const A& pmybuf)为什么这里是const A&
在这段代码中,函数myprint
的第二个参数是常量引用类型const A&
。这意味着,当我们调用这个函数时,可以传递一个A
类型的对象作为第二个参数,而不会对这个对象进行复制。使用常量引用类型的好处是可以避免复制大型复杂对象所带来的开销。
此外,由于这个参数是常量引用类型,所以我们不能在函数myprint
中修改传递给它的对象。这有助于保护传递给函数的对象不被意外修改。
总之,在这段代码中,使用常量引用类型作为函数参数可以避免复制大型复杂对象所带来的开销,并且可以保护传递给函数的对象不被意外修改。
2.总结
总结一些结论
-
传递int这种简单类型参数,建议都用值传递,不要使用引用类型
-
传递类对象作为参数,则避免隐式类型转换,全部都在创建线程这一行就构建出临时对象来,然后线程入口函数的形参位置使用引用来作为形参(如果不使用引用可能在某种情况下会导致多构造一次临时对象,不但浪费还有新的潜在问题,这样做的原因是想办法避免主线程退出导致子线程对内存的非法引用
-
建议不使用detach,只使用join,这样就不会存在局部变量失效导致线程对内存非法引用的问题
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)