C++多线程传参详解

目录

1.线程传参的过程

1.1 内置类型的实参

1.1.1参数按值传递

1.1.2如果想按引用传递,则需要调用std::ref

1.2 类类型的实参

1.2.1 传递的是左值对象

1.2.2 传递的是临时对象(即右值对象)

1.2.3 传递的参数需要隐式类型转换

1.2.4 传递的参数是指针

1.3 传入智能指针unique_ptr


1.线程传参的过程

下面是thread的源代码

template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );

源代码很复杂,反正我是看不懂。但是有一点可以确定,默认情况下实参都是按值传入产生一个副本到thread中(很多人可能都见过这句话,但可能不清楚具体细节,下面举例说明)

      实参从主线程传递到子线程的线程函数中,需要经过两次传递第1次发生在std::thread构造时,实参按值传递并以副本形式被保存到thread的tuple中,这一过程发生在主线程第2次发生在向线程函数传递时,此次传递是由子线程发起即发生在子线程中,并将之前std::thread内部保存的副本以右值的形式(通过调用std::move())传入线程函数

1.1 内置类型的实参

1.1.1参数按值传递

默认情况下,所有参数(含第1个参数可调用对象)均按值以副本的形式保存在std::thread对象中的tuple里。

这一点的实现类似于std::bind(不了解bind的可以去学习一下)

void func(int& a) //左值引用
{
	a = 6;
}

int main()
{
	int b = 1;
	thread t1(func,b); //错误。对实参b按值拷贝产生一个副本,将该副本存放在thread的tuple,
                       //随后对副本 调用std::move,产生一个右值,而func中的参数a是左值
                       //引用,不能绑定到右值
	cou
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值