管理线程之向线程函数传递参数
来源:互联网 发布:resnet网络结构全貌 编辑:程序博客网 时间:2024/04/30 07:27
向线程函数传递参数在构造线程对象时即可完成。但是要记住,默认情况下是把参数拷贝到线程内部,即使在函数中使用的是引用。例如
void f(int i,std::string const &s);std::thread t(f,3,"hello");上面代码中,函数f的第二个参数是std::string,传递的是char const *会转换为string。
当使用指针指向自动变量时,要特别注意:
void f(int i, std::string const& s);void oops(int some_param){char buffer[1024];sprintf(buffer,"%i",some_param);std::thread t(f,3,buffer);t.detach();}在这种情况下,指针指向局部变量buffer,然后传递到新创建的线程。很可能会发生函数oops已经终止,但是buffer还没有转换为std::string,这是buffer已经销毁。解决的方法就是在传递之前就转换:
void f(int i, std::string const& s);void oops(int some_param){char buffer[1024];sprintf(buffer,"%i",some_param);std::thread t(f,3,std::string(buffer));t.detach();}这是,依赖buffer想std::string的隐式转换,之后作为函数参数
可能会出现和上面相反的情况:线程拷贝了对象实例,但是你想要传递引用。在使用引用传递参数,线程更新数据时:
void update_data_for_widget(widget_id w,widget_data& data);void oops_again(widget_id w){widget_data data;std::thread t(update_data_for_widget,w,data);display_status();t.join();process_widget_data(data);}尽管update_data_for_widget希望第二个参数用引用传递,但是std::thread的构造函数不知道,这是函数的参数会被拷贝。当调用update_data_for_widget时,会传递拷贝data的引用,而不是data的引用。当线程终止,线程内部的拷贝析构,但是函数process_widget_data传递的是未更新的data。对于熟悉std:bind的人来说,马上就能想到解决的办法:你需要使用std::ref包装参数。需要更改线程创建形式为:
std::thread t(update_data_for_widget,w,std::ref(data));如果你熟悉std::bind,参数传递的语法就容易理解。因为std::thread的构造函数和std::bind都是使用同样的原理。这也就是说,你可以传递成员函数的指针作为函数参数,假如你使用对象指针作为第一个参数。
class X{public:void do_lengthy_work();};X my_x;std::thread t(&X::do_length_work,&my_x);上面代码会在新线程调用my_x.do_lengthy_work(),因为my_x的地址作为对象指针。你也可以提供参数例如成员函数调用:std::thread的第三个参数将会成为成员函数的第一个参数。
还有一种情况是函数参数对象不能拷贝,只能转移其所有权(例如STL中的auto_ptr指针)。std::unique_ptr就是这样的一个例子。std::unique指针一次只能指向一个对象,当指针析构时,对象也就被析构了。在赋值时是转移所有权(像auto_ptr)。在使用时,当对象是临时对象时,会自动调用move,当是个变量时必须调用move。
void process_big_object(std::unique_ptr<big_object>);std::unique_ptr<big_object> p(new big_object);p->prepare_data(42);std::thread t(process_big_object,std::move(p));
0 0
- 管理线程之向线程函数传递参数
- 如何向线程传递参数
- 如何向线程传递参数
- 如何向线程传递参数
- 向线程方法传递参数
- 如何向线程传递参数
- 如何向线程函数传递多个参数?
- 如何向线程函数传递多个参数?
- 【转】如何向线程传递参数
- java向线程中传递参数
- C# 实现向线程传递参数
- pthread_create函数的详细讲解(包括向线程函数传递参数详解)
- pthread_create函数的详细讲解(包括向线程函数传递参数详解)
- pthread_create函数的详细讲解(包括向线程函数传递参数详解)
- pthread_create函数的详细讲解(包括向线程函数传递参数详解)
- C# 线程中使用Timer,并向其触发的事件(函数)中传递参数
- C# 线程中使用Timer,并向其触发的事件(函数)中传递参数
- CreateThread给线程函数传递的参数
- JAVA NIO 详解
- 福建机器人自动抛光机
- javascript基于原型的继承机制
- [安卓]2dx 转译集成了 uMeng 的 HelloWorld 项目到安卓
- 谆阻足谞揍专滓尊卓滋足着卒鬃籽奏注子
- 管理线程之向线程函数传递参数
- 设计模式与其使用原则
- jquery ui ComboBox默认选中第一个
- 各种搞怪的标点符号表情
- 玩转FFmpeg的7个小技巧
- Onvif备忘录(1)----简介及开发框架搭建
- 着诅装嘴坐赚装坐兹琢钻坠篆阻状妆椎椎
- TextView属性大全-xml
- Linux下部署多个Tomcat(完整)