您当前的位置: 首页 >  c++

龚建波

暂无认证

  • 3浏览

    0关注

    312博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++ std::future期值

龚建波 发布时间:2019-09-13 21:39:17 ,浏览量:3

(本文参照C++在线手册和《C++并发编程实战》)

0.了解std::future

C++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 )

 类接口:

1.配合异步std::async

可以使用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             
关注
打赏
1655829268
查看更多评论
0.0543s