文档章节

并发,std::future和std::async

梦想游戏人
 梦想游戏人
发布于 2016/09/23 17:16
字数 446
阅读 259
收藏 1

当一个操作可以一步执行的时候,可以用std::async创建异步任务,异步任务的返回值就是任务函数的返回值,需要的时候再通过std::future (期望)的 get来获取,注意 get内部是std::move


int calculateBill(int base)
{
	Sleep(3000);
	return base * 2;
}

int main(...)
{
	std::future<int> _ans = std::async(calculateBill, 100); //创建异步任务, 任务返回值保存在std::future中
     //执行其他任务
	cout << "1111" << endl;
	cout << "222222" << endl;
	Sleep(1);
	cout << "3333333" << endl;
	cout << "444444" << endl;

   //需要异步任务结果的时候, 如果没返回 那么将会等待至返回
	cout << _ans.get() << endl;//get操作会阻塞

	while (true)
	{
		Sleep(100);
	}

	system("pause");
	return 0;
}

std::async提供了std:thread  不能提供的返回值 的功能

还可以选择异步形式,

std::launch::async   //开一个新线程执行
std::launch::deferred  //目标函数的调用延迟到wait或者get函数才执行 等同于 std::launch::sync
std::launch::async | std::launch::deferred //等同于std::launch::any

std::future<int> _ans = std::async( std::launch::async,calculateBill, 100); //异步执行
std::future<int> _ans = std::async( std::launch::deferred,calculateBill, 100);//等到get 或者wait才执行

 

还可以用std::packaged_task 来进一步封装任务,可以处理比如消息队列




typedef std::packaged_task<int(int)> task;

int calculateBill(int base)
{
	Sleep(500);
	return base * 2;
}

int main(...)
{
	std::vector<task> tasks;


	tasks.push_back(std::move(task(calculateBill)));
	tasks.push_back(std::move(task(calculateBill)));
	tasks.push_back(std::move(task(calculateBill)));
	tasks.push_back(std::move(task(calculateBill)));
	tasks.push_back(std::move(task(calculateBill)));
	tasks.push_back(std::move(task(calculateBill)));
	tasks.push_back(std::move(task(calculateBill)));
	tasks.push_back(std::move(task(calculateBill)));
	tasks.push_back(std::move(task(calculateBill)));
	tasks.push_back(std::move(task(calculateBill)));



	int i = 0;
	for (auto & task : tasks)
	{
		task(++i);
		std::future<int> ans1 = task.get_future();
		cout << ans1.get() << endl;//阻塞会等待结果的返回
	}

	system("pause");
	return 0;
}


还可以并发处理

	int i = 0;
	for (auto & task : tasks)
	{
		std::thread t([&]
		{
			task(++i);
			std::future<int> ans1 = task.get_future();
			cout << ans1.get() << endl;
		});

		t.detach();
	}

https://github.com/progschj/ThreadPool

© 著作权归作者所有

上一篇: C++位域内存分布
下一篇: 小大端
梦想游戏人
粉丝 41
博文 461
码字总数 132517
作品 0
成都
私信 提问
Multi thread: std::async()和std::future(1)

对于初学者而言,“以多线程运行程序”的最佳起点就是C++标准库中的 std::async() 和 class std::future提供的高级接口. (1),std::async()提供一个接口,让一段机能或者说一个callable obje...

SHIHUAMarryMe
2016/05/10
517
0
Multi thread: std::shared_future(2)

在之前我们了解了class std::future,但是通过class std::future获得的结果只能get()一次,第二次调用就会产生不可预期的结果,通常会抛出一个std::future_error。 但是当多个其他线程想处理另...

SHIHUAMarryMe
2016/05/13
218
0
Multi thread: std::promise

前面我们了解到可以使用std::sharedfuture/std::sharedfuture在多个其他线程中处理另外一个线程的函数的返回结果. 那么疑问来了,我们要怎样在多线程之间传递数据呢? demo1 :std::promise在线...

SHIHUAMarryMe
2016/05/14
108
0
TiKV Rust Client 迁移记 - Futures 0.1 至 0.3

作者介绍:Nick Cameron,PingCAP 研发工程师,Rust core team 成员,专注于分布式系统、数据库领域和 Rust 语言的进展。 最近我将一个中小型的 crate 从 futures 库的 0.1 迁移至了 0.3 版本...

TiDB
09/27
23
0
boost aiso 当接收到数据后,没有及时将数据缓存,将造成数据丢失,请大神帮偶看看

这是我服务器端收到数据后的回调函数 void InnerSession::handle_read( const boost::system::error_code& error, size_t bytes_transferred ) { if (error || bytes_transferred == 0) { st......

yeti3
2013/08/28
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部