std::future 和 std::promise 是 C++11 提供的线程安全异步值传递机制,用于单次结果传递;promise 设置值或异常(仅一次),future 通过 get() 获取(仅一次),二者通过共享状态关联,支持移动但不可拷贝。
std::future 和 std::promise 是 C++11 引入的一对配套工具,用于在线程间安全地传递单次结果值,适合“一个线程生产、另一个线程消费”的场景。它们不共享内存,也不需要手动加锁,本质是基于同步通道的异步值传递机制。
每个 std::promise 对象关联一个共享状态(shared state),它只能被调用一次 set_value()、set_exception() 或 set_exception_at_thread_exit()。多次调用会抛出 std::future_error 异常。
future 是 promise 的“读取端”,通过 get() 阻塞等待并取出值(或异常)。get() 只能调用一次,之后 future 失效(变为无效状态)。
以下是一个跨线程传递 int 值的最小可行代码:
#include#include #include int main() { std::promise p; std::future f = p.get_future(); // 获取关联 future std::thread t([&p]() { std::this_thread::sleep_for(std::chrono::seconds(1)); p.set_value(42); // 生产者设值 }); std::cout << "等待中..." << std::endl; int result = f.get(); // 消费者取值(阻塞) std::cout << "得到:" << result << std::endl; t.join(); }
注意:lambda 捕获 promise 时需用引用(&p),否则 set_value 作用于副本,主线程将永远阻塞。