Thread函数的参数传递和线程所有权转移(2.2)--std::move()

(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里面,便于管理。





  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeff_ROS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值