学习笔记(03):c++11并发与多线程-线程传参详解,detach()大坑,成员函数做线程函数...

本文深入探讨了C++中线程编程的细节,包括如何正确传递临时对象、避免常见陷阱,以及使用智能指针和成员函数指针的技巧。强调了在不同场景下选择合适参数传递方式的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

立即学习:https://edu.youkuaiyun.com/course/play/9377/196522?utm_source=blogtoedu

thread

join

detach

joinable

1.  传递临时对象作为线程参数

1.1要避免的陷阱

子线程的临时变量按引用传递是复制的,并不引用原来的地址。

detach子线程,绝对不能用指针,否则主线程结束,子线程出错。仍不推荐用引用。

1.2要避免的陷阱

类型转换构造函数,class A(int i);一个参数的构造函数

thread myjob(mypoint, myvar, string(char_ptr));

要在thread创建时进行转换。

1.3 总结

只要用临时构造的A类对象传递给子线程,那么一定能在主线程执行完毕前把变量传递给子线程。A(12)。不能隐式转换。

使用detach时:

若传递简单参数(如整数),推荐值传递。

若传递对象,避免隐式转换,全部在创建线程这一行构建出临时对象来,然后在函数内部用引用来接,否则会多构造一次,浪费。

终极建议:不用detach,只使用join;这样可以解决局部变量失效导致的非法引用问题。

2. 临时对象作为线程参数继续

2.1 线程id概念

线程id是个数字,每个线程都对应一个数字,线程不同,ID不同。std:: this_thread.getID()来获取;

2.2临时对象构造时机抓捕

3.传递类对象,智能指针作为线程参数

//std::ref()

如果想使用引用特性,在子线程中的修改传递到主线程,使用ref

class mobj;

thread myjob(myvar,std::ref(mobj));

智能指针

unique_ptr<int> myp(new int(100));

std::thread myobj(std::move(myp));

4.用成员函数指针做线程函数。

std::ref或者 &A::threadwork,后面跟参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值