夜间模式暗黑模式
字体
阴影
滤镜
圆角
主题色
C++多线程-Future库

future库

future是C++封装好的并发编程工具,通过promisepackaged_task, async创建的异步操作能提供一个future对象,future::get()用于获取异步任务的结果,调用future::get()会阻塞调用者,直到异步操作返回结果或者异常。

future

cppreference: future

  • get():返回结果
  • wait(), wait_for(), wait_until(): 等待结果可用
  • valid():检查有效性,调用get后就无效了,再次调用会抛出异常
  • share():返回一个shared_future,并让自身无效。

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();
}

C++11 并发指南

Thread support library

暂无评论

发送评论 编辑评论


				
上一篇