(本文参照C++在线手册和《C++并发编程实战》)
0.了解std::futureC++11提供了类模板std::future来访问异步操作结果。可以使用future来代表特定的一次性事件,线程周期性的在这个future上检测事件是否发生,当所需的事件已发生future变为就绪状态,事件发生之后future也无法复位。标准库中有两类future,唯一future(std::future)对象是仅有的一个指向其关联事件的实例,而多个共享future(std::shared_future)对象可以指向同一共享状态。对于共享future而言,所有实例对象将同时变为就绪。最基本的一次性事件是在后台运行着的计算结果(这书把异步说的这么复杂)。
(虽然future被用于线程间通信,但是future对象本身并不提供同步访问,需要使用互斥锁或其他同步机制来保护访问。)
操作流程:
- (通过 std::async、std::packaged_atsk 或 std::promise 创建的)异步操作能提供一个 std::future 对象给该异步操作的创建者。(如:std::future f = std::async(std::launch::async, [](){ return 8; }); )
- 然后,异步操作的创建者能用各种方法查询、等待或从 std::future 提取值。若异步操作仍未提供值,则这些方法可能阻塞。(如:f.wait(); 或 f.get(); )
- 异步操作准备好发送结果给创建者时,它能通过修改链接到创建者的 std::future 的共享状态进行。(如 : std::promise::set_value )
类接口:
可以使用std::async异步地执行一个函数,并返回一个std::future,std::future最终最终将持有函数的返回值。std::async的参数传递方式类似std::bind,此外还可以传递一个指定调用策略的参数。若设置std::launch::async标志,则函数在新的线程执行;设置std::launch::deferred则函数在调用wait()或get()时执行,该参数默认为std::launch::async|std::launch::deferred,即由具体实现来选择。并且,std::async参数中的可调用对象和给可调用对象的参数需要满足移动构造的要求。
#include
#include
#include
struct X
{
void foo(int, std::string const&){}
std::string bar(std::string const&) { return std::string("yes"); }
};
X x;
auto f1 = std::async(&X::foo, &x, 1, "hello"); //调用obj->foo(1,"hello"),其中obj是&x
auto f2 = std::async(&X::bar, x, "goodbye"); //调用obj.bar("goodbye"),其中obj是x的副本
struct Y
{
double operator()(double f) { return f * f; } //仿函数
};
Y y;
auto f3 = std::async(Y(), 123); //调用obj(123),其中obj是从Y()移动构造,可以自定义移动构造
auto f4 = std::async(std::ref(y), 123); //调用y(123)
X baz(X& x) {
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?