C++如何使用std::future和std::promise进行线程间通信?(代码示例)

admin 百科 14
std::future和std::promise是C++11提供的单次值线程间传递机制:promise通过set_value/set_exception写入结果,future通过get/wait_for读取,共享状态自动同步,仅可移动不可拷贝。

C++如何使用std::future和std::promise进行线程间通信?(代码示例)-第1张图片-佛山资讯网

std::future 和 std::promise 是 C++11 引入的用于在线程间传递单次值的配套机制:promise 负责“设置”结果,future 负责“获取”结果。它们不共享内存,而是通过一个共享状态(shared state)解耦生产者与消费者,适合一对一线程通信或异步任务结果传递。

基本配对用法:一个线程设值,另一个取值

promise 对象持有可写入的共享状态,调用 set_value() 后,绑定的 future 就能通过 get() 安全读取(若未就绪则阻塞)。注意:每个 promise/future 对只能使用一次,且不能拷贝(仅可移动)。

// 示例:主线程等待子线程计算完成

#include <future>
#include <thread>
#include <iostream>

int main() {
    std::promise<int> prom;
    std::future<int> fut = prom.get_future(); // 获取关联的 future

    std::thread t([&prom]() {
        // 模拟耗时计算
        std::this_thread::sleep_for(std::chrono::seconds(1));
        prom.set_value(42); // 设置结果(只能调用一次)
    });

    std::cout << "等待结果...\n";
    int result = fut.get(); // 阻塞直到 set_value 被调用
    std::cout << "得到结果:" << result << "\n";

    t.join();
    return 0;
}

登录后复制

处理异常:用 set_exception 传递错误

如果异步操作可能失败,promise 支持通过 set_exception 传递异常对象,future 的 get() 会重新抛出该异常,避免错误被静默吞掉。

立即学习“C++免费学习笔记(深入)”;

标签: ai c++ ios stream 异步任务 red

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~