future库
future
是C++封装好的并发编程工具,通过promise
,packaged_task
, async
创建的异步操作能提供一个future
对象,future::get()
用于获取异步任务的结果,调用future::get()
会阻塞调用者,直到异步操作返回结果或者异常。
future
get()
:返回结果wait(), wait_for(), wait_until()
: 等待结果可用valid()
:检查有效性,调用get后就无效了,再次调用会抛出异常share()
:返回一个shared_future
,并让自身无效。
可以复制,多个线程可以同时等待。
promise
可以存储一个值,并使用future对象获取。
get_future()
:获取关联的future对象set_value(), set_exception()
:设置值或者异常,阻塞在future::get()
的线程会得到释放
packaged_task
封装一个可调用对象,使用get_future()
返回一个关联其调用结果的future对象
int fib(int n)
{
if (n < 3) return 1;
else return fib(n-1) + fib(n-2);
}
std::packaged_task<int(int)> fib_task(&fib);
auto result = fib_task.get_future();
std::thread t(std::move(fib_task), 40);
std::cout << result.get() << '\n';
t.join();
async
async( Function&& f, Args&&... args )
异步调用f,返回一个关联结果的future对象
// 并行求和
template <typename RandomIt>
auto parallel_sum(RandomIt beg, RandomIt end) -> decltype(*beg + *beg)
{
auto len = end - beg;
if(len < 1e4) return std::accumulate(beg, end, 0);
auto mid = beg + len/2;
auto fut = std::async(std::launch::async, parallel_sum<RandomIt>, mid, end);
auto sum = parallel_sum(beg, mid);
std::cout << fut.get() << std::endl;
return sum + fut.get();
}