值得一看
广告
彩虹云商城
广告

热门广告位

c++怎么使用future和promise_future与promise异步编程指南

std::future和std::promise用于线程间异步传递结果,其中promise设置值,future获取值,实现同步;可通过thread、async或packaged_task结合使用,注意set_value只能调用一次,get()后值被移动,且需避免未设置值时销毁promise。

c++怎么使用future和promise_future与promise异步编程指南

在C++中,std::futurestd::promise 是实现异步编程的重要工具,它们属于标准库中的 <future> 头文件。通过这两个机制,可以在一个线程中设置值,另一个线程中获取该值,实现线程间的数据传递和结果同步。

1. 基本概念:future 与 promise 的作用

std::promise 是一个可写入一次的对象,用于保存某个操作的结果。每个 promise 可以关联一个 std::future,future 是读取端,用来获取 promise 设置的值或异常。

简单来说:

  • promise 负责“生产”数据(set_value 或 set_exception)
  • future 负责“消费”数据(get)

一旦值被设置,future 的 get() 就能返回结果;如果还没准备好,get() 会阻塞等待。

立即进入“豆包AI人工智官网入口”;

立即学习“豆包AI人工智能在线问答入口”;

2. 创建并使用 promise 和 future

下面是基本用法示例:

// 示例:主线程等待子线程完成任务并返回结果
#include <iostream>
#include <thread>
#include <future>
void compute(std::promise<int>& result) {
try {
// 模拟耗时计算
std::this_thread::sleep_for(std::chrono::seconds(2));
int value = 42;
result.set_value(value); // 设置结果
} catch (…) {
result.set_exception(std::current_exception());
}
}
int main() {
std::promise<int> prom;
std::future<int> fut = prom.get_future(); // 获取对应的 future
std::thread t(compute, std::ref(prom));
std::cout << “等待结果…\n”;
int result = fut.get(); // 阻塞直到值可用
std::cout << “结果是: ” << result << “\n”;
t.join();
return 0;
}

说明:

  • 创建 std::promise<int> 来准备传递一个整型结果
  • 调用 get_future() 获取其对应的 future 对象
  • 将 promise 引用传给子线程函数,在其中设置结果
  • 主线程调用 fut.get() 等待并获取结果

3. 使用 async 和 packaged_task 替代手动管理线程

除了直接配合线程使用,future 还可以结合 std::asyncstd::packaged_task 实现更简洁的异步调用。

豆包AI编程

豆包AI编程

豆包推出的AI编程助手

豆包AI编程483

查看详情
豆包AI编程

// 使用 std::async 自动启动异步任务
#include <iostream>
#include <future>
int heavy_calculation() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return 84;
}
int main() {
std::future<int> fut = std::async(heavy_calculation);
std::cout << “正在计算…\n”;
int result = fut.get();
std::cout << “计算完成,结果为: ” << result << “\n”;
return 0;
}

这里 std::async 返回一个 future,自动处理线程生命周期,适合简单场景。

另一种方式是 packaged_task,它把可调用对象包装成带 future 的任务:

std::packaged_task<int()> task(heavy_calculation);
std::future<int> fut = task.get_future();
std::thread t(std::move(task)); // 启动任务
int result = fut.get(); // 获取结果
t.join();

这种方式更灵活,可用于事件队列、线程池等复杂结构。

4. 注意事项与常见问题

使用 future 和 promise 时需注意以下几点:

  • 每个 promise 只能调用一次 set_valueset_exception,重复调用会抛出异常
  • 如果 promise 被销毁前未设置值,future 的 get() 会收到 std::future_error
  • future 的 get() 只能调用一次,之后不能再用(值已被移动)
  • 可以用 wait_forwait_until 实现超时检查,避免无限等待

auto status = fut.wait_for(std::chrono::milliseconds(100));
if (status == std::future_status::ready) {
std::cout << “结果已就绪: ” << fut.get() << “\n”;
} else {
std::cout << “还在处理中…\n”;
}

这比直接阻塞更安全,适用于需要响应性的程序。

基本上就这些。掌握 future 和 promise 能帮助你写出清晰、高效的异步代码,尤其在多线程协作和任务解耦方面非常有用。

相关标签:

工具 ai c++ ios stream 异步任务 常见问题 标准库 if include try catch 整型 auto int void 线程 多线程 线程生命周期 主线程 Thread 对象 事件 promise 异步
温馨提示: 本文最后更新于2025-10-08 22:28:49,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞12赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容