C++并发高级接口:std::async和std::future
std::async和std::future
std::async创建一个后台线程执行传递的任务,这个任务只要是callable object均可,然后返回一个std::future。future储存一个多线程共享的状态,当调用future.get时会阻塞直到绑定的task执行完毕:
#include <iostream>
#include <future>
void task() {
for (int i = 0; i < 10; i++) {
std::cout << "A";
}
}
int main() {
std::future<void> result{ std::async(task) };
for (int i = 0; i < 10; i++) {
std::cout << "B";
}
result.get(); //强制阻塞main线程,直到task线程执行完毕
system("pause");
return 0;
}
std::launch::async
上面task返回void,这个结果没用,我们只是单纯的想等待任务线程结束。
对这种需求还可以用更简单的方法:指定一个launch policy
#include <iostream>
#include <future>
void task() {
for (int i = 0; i < 10; i++) {
std::cout << "A";
}
}
int main() {
std::future<void> result{ std::async(std::launch::async,task) };
for (int i = 0; i < 10; i++) {
std::cout << "B";
}
system("pause");
return 0;
}
在创建async的时候指定一个launch policy,连result.get都可以不用了,不过还是需要把async的返回值赋给result。如果不赋值async会和同步调用一样在这里阻塞直到调用完毕,相当于没用async。
总共有两种launch policy:
std::launch::async当返回的future失效前会强制执行task,即不调用future.get也会保证task的执行std::launch::deferred仅当调用future.get时才会执行task
如果创建async时不指定launch policy,他会默认std::launch::async|std::launch::deferred,根据情况选一种执行
std::launch::deferred
再来试试std::launch::deferred策略。
#include <iostream>
#include <future>
void task() {
for (int i = 0; i < 10; i++) {
std::cout << "A";
}
}
int main() {
std::future<void> result{ std::async(std::launch::deferred,task) };
for (int i = 0; i < 10; i++) {
std::cout << "B";
}
result.get();
system("pause");
return 0;
}
程序输出BBBBBBBBBBAAAAAAAAAA,和我们说的一样,创建async的时候它并没有开启新线程执行任务,而是等到result.get的时候才执行
C++并发高级接口:std::async和std::future的更多相关文章
- C++11 使用异步编程std::async和std::future
先说明一点:std::asyanc是std::future的高级封装, 一般我们不会直接使用std::futrue,而是使用对std::future的高级封装std::async. 下面分别说一下. ...
- C++并发低级接口:std::thread和std::promise
std::thread和std::promise 相比std::async,std::thread就原始多了.thread一定会创建新线程(而不是像async那样创建的时候可能不会,后面才创建新线程( ...
- std::async的使用总结
C++98标准中并没有线程库的存在,直到C++11中才终于提供了多线程的标准库,提供了管理线程.保护共享数据.线程间同步操作.原子操作等类.多线程库对应的头文件是#include <thread ...
- 第26课 std::async异步任务
一. std::async函数模板 (一)std::async和std::thread的区别 1. 两者最明显的区别在于async采用默认启动策略时并不一定创建新的线程.如果系统资源紧张,那么std: ...
- c++ 如何获取多线程的返回值?(std::thread ,std::async)
//简单的 c++11 线程,简单方便,成员函数随便调用,非成员函数也一样,如需要获取返回时,请自行使用条件变量 std::thread run([&](){ //执行一些耗时的操作 retu ...
- 【C++并发实战】(三) std::future和std::promise
std::future和std::promise std::future std::future期待一个返回,从一个异步调用的角度来说,future更像是执行函数的返回值,C++标准库使用std::f ...
- The promises and challenges of std::async task-based parallelism in C++11 C++11 std::async/future/promise
转载 http://eli.thegreenplace.net/2016/the-promises-and-challenges-of-stdasync-task-based-parallelism- ...
- C++11之std::future和std::promise和std::std::packaged_task
为什么C++11引入std::future和std::promise?C++11创建了线程以后,我们不能直接从thread.join()得到结果,必须定义一个变量,在线程执行时,对这个变量赋值,然后执 ...
- C++并发编程之std::async(), std::future, std::promise, std::packaged_task
c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: void f(int n); std::thread t(f, n + 1); t.join(); 但是线程毕竟是属于比 ...
随机推荐
- Spring 4.2.5 + Quartz 2.2.0整合
jar包使用的Maven库管理的,在这就不罗列了,注意下只有spring3.x以上的版本才支持quartz2.x的版本. 配置文件: <?xml version="1.0" ...
- Spring Cloud之——Config(配置中心)
Spring Cloud Config(配置中心) 大家好,有一段时间没有写技术博客了.由于工作上的事情,这方面很难分配时间.近几年随着服务化的兴起,一批服务化的框架应运而生,像dubbo,thrif ...
- python json.dumps 中的ensure_ascii 参数引起的中文编码问题
在使用json.dumps时要注意一个问题 >>> import json >>> print json.dumps('中国') "\u4e2d\u5 ...
- JSON定义
如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如xml,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过 ...
- javascript中的事件类型
表单事件 submit reset click change focus blur input window事件 load DomContentLoaded readyStatechange unlo ...
- Spring Cloud学习笔记-005
服务消费者 之前已经搭建好了微服务中的核心组件——服务注册中心(包括单节点模式和高可用模式).也有了服务提供者,接下来搭建一个服务消费者,它主要完成两个目标,发现服务以及消费服务.其中,服务发现的任务 ...
- 存储过程学习笔记(SQL数据库
一. 存储过程简介 Sql Server的存储过程是一个被命名的存储在服务器上的Transacation-Sql语句集合,是封装重复性工作的一种方法,它支持用户声明的变量.条件执行和其他强大的编程 ...
- [LeetCode] Freedom Trail 自由之路
In the video game Fallout 4, the quest "Road to Freedom" requires players to reach a metal ...
- java利用poi来读取execl表格返回对象
利用poi来读取execl表格,返回一个对象(可能有点不完善,但是应该能满足平常的所用),用到了反射等等; 使用的jar包有: commons-collections4-4.1.jar poi-3.1 ...
- osx mitmproxy ssl 错误
记录一下,总是在这里折腾. cd ~ cd .mitmproxy cp mitmproxy-ca-cert.pem ~/ 然后到目录下双击mitmproxy-ca-cert.pem ,在钥匙串中的登录 ...