std::promise
是C++11引入的一种同步机制,它与std::future
一起使用,用于在不同线程间传递值或通知。一个std::promise
对象可以存储某种类型的值(或异常),这个值可以在未来某个时刻通过与之关联的std::future
对象来检索。这种机制非常适合用于异步编程模型,其中某个操作的结果将在未来可用,而且该操作可能在另一个线程中执行。
使用std::promise
std::promise
的基本用法包括以下几个步骤:
- 创建
std::promise
对象:你可以为promise
指定一个类型,该类型是它将持有并传递的值的类型。 - 获取与
promise
相关联的std::future
对象:通过调用promise
的get_future
方法,你可以获取一个future
对象。这个future
对象可以用来在未来某个时刻检索promise
存储的值。 - 在生产者线程中设置值或异常:可以通过
promise
的set_value
或set_exception
方法来存储一个值或异常。 - 在消费者线程中通过
future
对象检索值:消费者线程可以通过与promise
关联的future
对象等待值变得可用,并检索该值。
示例
下面是一个简单的例子,展示了如何使用std::promise
和std::future
来在两个线程间传递一个整数值:
#include <iostream> #include <future> #include <thread> void producer(std::promise<int> promise) { // 做一些操作... std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟耗时操作 // 设置值 promise.set_value(42); } void consumer(std::future<int> future) { // 等待值变得可用 int value = future.get(); // 这将阻塞,直到值被生产者线程设置 std::cout << "Received value: " << value << std::endl; } int main() { std::promise<int> promise; std::future<int> future = promise.get_future(); std::thread producerThread(producer, std::move(promise)); std::thread consumerThread(consumer, std::move(future)); producerThread.join(); consumerThread.join(); return 0; }
在这个例子中,producer
函数设置promise
的值,而consumer
函数等待并获取这个值。注意到我们需要将promise
和future
通过std::move
传递给线程函数,因为这些对象都不支持拷贝操作,只能被移动。这样的设计确保了与每个promise
对象关联的future
对象的唯一性。