一: 向线程函数传递参数
thread的构造函数里第一个参数为调用对象, 从第二个参数起, 为线程函数的第一个参数
//若用cout<< *** <<endl输出可能会乱序
void func(int i,string s)
{
printf("i=%d,s=%s",i,s.c_str());
}
int main()
{
int i=1;
char s[]="test";
//第一个参数为调用对象, 从第二个参数起, 为线程函数的第一个参数
thread t1(func,i,s);
t1.detach();
}
----------------------------
线程内部有存储空间, 参数会按照默认方式复制到该处, 新创建的线程才能直接访问他们
上面的代码数组s以char const*的形式传入, 进入线程的上下文环境以后, 才转换为string类型
但有问题:
可能没转换之前, 主线程已经退出,并销毁s, 造成子线程对s的悬空引用
一个解决办法如下: 加上string(s)保证在传进参数之前已经转化为string对象
//若用cout<< *** <<endl输出可能会乱序
void func(int i,const string &s)
{
printf("i=%d,s=%s",i,s.c_str());
}
int main()
{
int i=1;
char s[]="test";
//第一个参数为调用对象, 从第二个参数起, 为线程函数的第一个参数
//加上string(s)保证在传进参数之前已经转化为string对象
thread t1(func,i,string(s));
t1.detach();
}
-----------------------
考虑另一种情形, 参数需要非const引用, 而不复制对象, 以下代码编译失败
void func(int &i)
{
printf("i=%d");
}
int main()
{
int i=1;
//编译失败
thread t1(func,i);
t1.join();
}
原因