C++ future的使用

C++ 的 std::future 库是 C++11 标准引入的一个并发编程工具,它允许异步编程和结果检索。std::future 通常与 std::asyncstd::promisestd::packaged_task 一起使用,以支持异步操作。

1. std::async

std::async 函数用于在单独的线程中异步地启动函数调用,并返回一个 std::future 对象,该对象用于获取异步调用的结果。

#include <iostream>
#include <future>

int myFunction(int a) {
    // 模拟一些计算工作
    std::this_thread::sleep_for(std::chrono::seconds(1));
    return a * 2;
}

int main() {
    // 异步启动函数
    std::future<int> fut = std::async(std::launch::async, myFunction, 10);

    // 等待异步操作完成
    // 注意:std::future::get() 会阻塞,直到结果可用
    int result = fut.get();

    std::cout << "Result: " << result << std::endl;

    return 0;
}

2. std::future

std::future 是一个模板类,它代表了一个异步操作的结果。你可以使用 std::future::get() 方法来获取异步操作的结果。如果异步操作尚未完成,get() 方法会阻塞,直到结果可用。

3. std::promisestd::packaged_task

  • std::promise 允许你在一个线程中设置结果(或异常),然后在另一个线程中通过 std::future 获取该结果。
  • std::packaged_task 是一个将可调用对象(如函数、lambda 表达式或函数对象)包装为异步任务的类。它内部使用 std::promisestd::future 来管理异步操作的结果。

注意事项

  • 使用 std::async 时,确保传递 std::launch::async 作为第一个参数,以确保函数在单独的线程中异步执行。如果不传递此参数,std::async 可能会同步地调用函数(这取决于实现和调用上下文)。
  • 当你不再需要 std::future 对象时,确保它不被销毁,直到你已经调用了 get()wait(),或者你确定异步操作已经完成。否则,你可能会丢失异步操作的结果。
  • 注意异常安全性。如果异步函数抛出异常,而你没有在调用 get() 时捕获它,该异常将在 get() 被调用时重新抛出。
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑袋不够用的小渣渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值