学习C++ std::promise

 10个月前     78  

文章目录

std::promise是C++11引入的一种同步机制,它与std::future一起使用,用于在不同线程间传递值或通知。一个std::promise对象可以存储某种类型的值(或异常),这个值可以在未来某个时刻通过与之关联的std::future对象来检索。这种机制非常适合用于异步编程模型,其中某个操作的结果将在未来可用,而且该操作可能在另一个线程中执行。

使用std::promise

std::promise的基本用法包括以下几个步骤:

  1. 创建std::promise对象:你可以为promise指定一个类型,该类型是它将持有并传递的值的类型。
  2. 获取与promise相关联的std::future对象:通过调用promiseget_future方法,你可以获取一个future对象。这个future对象可以用来在未来某个时刻检索promise存储的值。
  3. 在生产者线程中设置值或异常:可以通过promiseset_valueset_exception方法来存储一个值或异常。
  4. 在消费者线程中通过future对象检索值:消费者线程可以通过与promise关联的future对象等待值变得可用,并检索该值。

示例

下面是一个简单的例子,展示了如何使用std::promisestd::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函数等待并获取这个值。注意到我们需要将promisefuture通过std::move传递给线程函数,因为这些对象都不支持拷贝操作,只能被移动。这样的设计确保了与每个promise对象关联的future对象的唯一性。

版权声明:yuluo 发表于 10个月前,共 1267 字。
转载请注明:学习C++ std::promise | 夏日回音

您可能感兴趣的

暂无评论

您必须 [ 登录 ] 才能发表留言!

暂无评论...