一:概述
std::promise 和 std::future 是C++标准库的两种工具,主要用于实现线程之间的异步通信。它们属于C++并发库的一部分,提供了一种安全,优雅的方式来在线程之间传递结果或状态。
二:std::promise 介绍
std::promise 用于在线程之间传递值或状态,是一种能够在一个线程中存储值(或异常)的对象。
常用方法有以下几种:
set_value(value) 设置异步操作的结果,通知关联的std::future.
set_exception(ex) 设置一个异常,通知关联的 std::future 发生错误
get_future() 获取该 promise 关联的 future 对象,用于结果的获取
三:std::future 介绍
std::future 提供了一个从异步任务中获取值的机制,它是一个可以从另一个线程获取值(或异常)的对象。
常用方法有以下几种:
get() 获取异步任务的结果(如果有异常会抛出)
wait() 阻塞当前线程,直到异步任务完成。
wait_for() 等待指定的时间,返回任务是否完成(非阻塞)
valid() 检查 future 是否有效,表示是否能获取结果。
四:例子
#include <iostream>
#include <future>
#include <thread>
#include <chrono>using namespace std::literals::chrono_literals; void getAnswer(std::promise<int> intPromise)
{std::this_thread::sleep_for(5s);intPromise.set_value(10);
}int main()
{std::promise<int> answerPromise;auto fut = answerPromise.get_future();std::thread workerThread(getAnswer, std::move(answerPromise)); std::future_status status{};do{status = fut.wait_for(0.5s);std::cout << "main thread doing something..." << '\n';} while (status != std::future_status::ready);std::cout << "answer: " << fut.get() << '\n';workerThread.join();return 0;
}