管理线程之向线程函数传递參数

向线程函数传递參数在构造线程对象时就可以完毕。可是要记住,默认情况下是把參数复制到线程内部,即使在函数中使用的是引用。比如

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,參数传递的语法就easy理解。

由于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));
时间: 2024-08-02 11:02:41

管理线程之向线程函数传递參数的相关文章

公开的函数把函数作为參数

假设想公开把其它的函数作为參数的函数.最好的方法是用托付(delegate). 考虑以下的样例.定义了两个函数,一个是公开函数,还有一个把函数公开为托付. module Strangelights.DemoModuleopen System /// a function that provides filtering let filterStringList f ra = ra |>Seq.filter f // another function that provides filtering

c 语言函数可变參数的处理

/************************************************************************* > File Name: va_list.c > Author: zshh0604 > Mail: [email protected] > Created Time: 2014年10月14日 星期二 15时16分09秒 **********************************************************

nginx负载均衡向后台传递參数方法(后端也是nginxserver)

做了一个站点是用nginx 做的负载均衡.后端也是多个nginxserver 遇到了一个问题.当做SSL支持时 前端nginx分发到 后端nginx后就成 http形式了(这样后台php用$_SERVER[HTTPS] == "on" 就无法推断了,但后台还必需要知道这个參数).假设改成https的话.还需要多个证书. 所以就想让前端nginx 假设是 https 的话给后端传递一个參数. 用在后台来推断和使用. 首先前端nginx的 nginx.conf 文件里 用  proxy_s

管理线程之创建线程

主要的线程管理包含:1.创建线程.2.等待它结束或在后台执行. 3.向线程函数传递參数.更改线程对象全部权.4.选择线程和使用特定线程. 创建线程 线程在创建线程对象时開始执行,创建线程对象使用std::thread.像上节最后那个函数一样.最简单的情况是线程对象创建后执行一个无返回值.无參数的函数. 这个函数在线程中执行直到返回,这时线程终止. 想一下最复杂的情况,线程执行的函数可能是个函数对象.须要传递參数,执行一系列独立的操作.这些操作须要系统的一些信息,直到接收到某个信号终止. 线程执行

setTimeOut传參数

function blink(e_Id, second) {var soccer = document.getElementById(e_Id); soccer.style.visibility = (soccer.style.visibility == "hidden") ? "visible" : "hidden" setTimeout(_show(e_Id, second), second); } function _show(name,

线程间的參数传递

在多线程编程中.经常须要从主线程传递參数给子线程或在主线程中获得子线程的计算结果, 若使用全局变量实现.必定须要对临界区保护,因此导致大量的切换工作造成效率的低下. 而利用进程间的參数传递能够解决这一问题. 两个方向的參数传递: 1.主线程向子线程传递參数: 通过函数 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg); 在创建线程

C语言函数參数传递原理

C语言中參数的传递方式一般存在两种方式:一种是通过栈的形式传递.还有一种是通过寄存器的方式传递的. 这次.我们仅仅是具体描写叙述一下第一种參数传递方式,第二种方式在这里不做具体介绍. 首先,我们看一下,以下一个简单的调用例程: int Add (int a, int b, int c) { return a+b+c; } void main() { int x =0 , y = 1, z = 2; int result = 0; result = Add(x, y, z); printf("Re

函数指针作为函数參数,实现冒泡排序的升序排序和降序排序

#include<stdio.h> #define N 10//定义数组元素个数 int Ascending(int a,int b);//升序排列的函数声明 int Descending(int a,int b);//降序排列的函数声明 void swap(int*,int*);//交换数据的函数声明 void BubbleSort(int a[],int n,int (*compare)(int,int));//声明排序函数,通过函数指针作为函数调用 void Display(int a[

Python学习笔记7:函数对象及函数对象作參数

一.lambda函数 比如: fun1 = lambda x,y: x + y print fun1(3,4) 输出:7 lambda生成一个函数对象.该函数參数为x,y,返回值为x+y.函数对象赋给func. func的调用与正常函数无异. 上面的代码等价于: def fun2(x, y): return x + y 二.函数作为參数 函数能够作为一个对象.进行參数传递. 比如: fun = lambda x ,y : x+y def runFun(fun, a, b): print fun(