目录
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

571

被折叠的 条评论
为什么被折叠?



