C++ 多线程异步(std::packaged_task)

一 简介

C++11中的std::packaged_task是个模板类。因此我们需要将模板参数传递给packaged_task<>,即可调用函数的类型。同时std::packaged_task<>可移动,但是不可复制,所以我们需要将它传递给线程。

std::packaged_task对象内部包含两个元素:

  1. 存储的任务(函数)是一些可调用的对象。
  2. 共享状态(future),它可以存储调用存储的任的结果,并可以通过get_future获取去进行异步访问

二例子

方法
get_future:返回一个与packaged_task对象的共享状态关联的std::future对象

#include <iostream>
#include <thread>
#include <future>
#include <string>

//从DB获取数据
std::string getData(std::string str) 
{
	//获取数据
	std::this_thread::sleep_for(seconds(5));
	return "Q是德华";
}

int main() 
{

	//lamda
	创建封装回调函数的packaged_task<>
	//std::packaged_task<std::string(std::string)> task([](std::string)->std::string {
	//	//获取数据
	//	std::this_thread::sleep_for(seconds(5));
	//	return "Q是德华";
	//
	//});

	//创建封装回调函数的packaged_task<>
	std::packaged_task<std::string(std::string)> task(getData);

	//从packaged_task<>获取相关的future<>
	std::future<std::string> result = task.get_future();

	//将packaged_task传递给线程以异步运行
	//std::packaged_task<>可移动,但是不可复制,所以我们需要将它传递给线程
	//它只是个任务,不会自己执行,需要启动
	std::thread th(std::move(task), "...");

	//获取packaged_task<>的结果,即getData()的返回值
	std::string data = result.get();//线程不需要阻塞,get自己会阻塞的
	std::cout << data << std::endl;

	system("pause");
	return 0;
}

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值