(1)先上代码:
void f(int i,std::string const & s);
std::thread t(f,"hello");
第一个参数是线程函数名,第二个参数是函数的参数。但是注意一点,当提供参数是自动变量的指针时,如:
void fn(int i, std::string const & s);
void opp(int some_param)
{
char buffer[1024];
sprintf(buffer, "%i", some_param);
std::thread t(fn, 3, buffer);
t.detach();
}
局部变量buffer的指针传递给新的线程,这需要一个时机,如果线程函数在buffer转换为std::string之前退出,那就不好了,解决办法:
std::thread t(fn, 3,(std::string) buffer);//这样就避免了buffer悬浮指针
(2)还有一种情况,就是对象被复制传递了,但我们想要的是引用,结果变量副本改变了,而变量实际没有改变。
void update_data(widget_id w, widget_data& data);
void opp_again(widget_id w)
{
widget_data data;
std::thread t(update_data, w, data);
display_status();
t.join();
process_widget_data(data);//data的值并没有改变
}
着其实和函数的参数很一致,我们的解决办法是:
std::thread t(update_data, w, std::ref(data));
(3)线程的所有权转移,std::thread是不可复制的,但是是可移动的movable,也就是可以把线程的所有权转移,但一个线程只能有一个所有权。
void some_function();
void some_other_function();
std::thread t1(some_function);
std::thread t2(std::move(t1));//显示转移所有权
t1 = std::thread(some_other_function); //隐式转移所有权
std::thread t3 = std::move(t2);
t1 = std::move(t3);
当然,我们可以把多个线程放入一个vector里面,便于管理。