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对象的唯一性。