[C++11]std::promise介绍及使用,std::future

std::promise是C++11并发编程的关键工具,它允许在不同线程间传递值或异常。配合std::future使用,可以在一个线程中设置值,另一个线程异步获取。文章通过代码示例展示了如何创建std::promise,设置值以及通过std::future等待和获取结果,说明了它们在实现线程间通信和同步中的作用。
摘要由CSDN通过智能技术生成

std::promise - cppreference.com

类模板 std::promise 提供存储值或异常的设施,之后通过 std::promise 对象所创建的 std::future 对象异步获得结果。注意 std::promise 只应当使用一次。

(571条消息) [C++11]std::promise介绍及使用_Hello,C++!的博客-CSDN博客

C++11使用std::future和std::promise在线程中传递变量实现异步操作。

(700条消息) C++11中std::future的使用_fengbingchun的博客-CSDN博客

学习C++:学习promise和future的使用_std::promise<void>().get_future().wait()-CSDN博客

#include <iostream>
#include <thread>
#include <future>
#include <chrono>

int main() {
  std::promise<int> p;
  std::thread thread_([&p]{
    std::cout << "thead_id: " << std::this_thread::get_id() << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1));
    p.set_value(10);
  });
  std::cout << "main thread_id: " << std::this_thread::get_id() << std::endl;
  std::future_status status;
  auto f= p.get_future();
  //调用get()会阻塞直到状态为ready
  //auto v = f.get();
  //std::cout << "v: " << v << std::endl;
  do {
    status = f.wait_for(std::chrono::milliseconds(100));
    if (status == std::future_status::timeout) {
      std::cout << "timeout..." << std::endl;
    } else if (status == std::future_status::ready) {
      int val = f.get();
      std::cout << "ready, val: " << val << std::endl;
    } else {
      std::cout << "other..." << std::endl;
    }
  } while (status != std::future_status::ready);
  thread_.join();
  return 0;
}

一、std::promise介绍

std::promise 是C++11并发编程中常用的一个类,常配合std::future使用。其作用是在一个线程t1中保存一个类型typename T的值,可供相绑定的std::future对象在另一线程t2中获取。

std::future 可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段。std::future 通常由某个 Provider 创建,你可以把 Provider 想象成一个异步任务的提供者,Provider 在某个线程中设置共享状态的值,与该共享状态相关联的 std::future 对象调用 get(通常在另外一个线程中) 获取该值,如果共享状态的标志不为 ready,则调用 std::future::get 会阻塞当前的调用者,直到 Provider 设置了共享状态的值(此时共享状态的标志变为 ready),std::future::get 返回异步任务的值或异常(如果发生了异常)。

二、代码示例:

下面我们通过几个简单小例子逐渐深入了解std::promise的使用方法。

示例1:


#include <iostream>
#include <future>
#include <chrono>
 
void Thread_Fun1(std::promise<int> &p)
{
    //为了突出效果,可以使线程休眠5s
    std::this_thread::sleep_for(std::chrono::seconds(5));
 
    int iVal = 233;
    std::cout << "传入数据(int):" << iVal << std::endl;
 
    //传入数据iVal
    p.set_value(iVal);
}
 
void Thread_Fun2(std::future<int> &f)
{
    //阻塞函数,直到收到相关联的std::promise对象传入的数据
    auto iVal = f.get();        //iVal = 233
 
    std::cout << "收到数据(int):" << iVal << std::endl;
}
 
int main()
{
    //声明一个std::promise对象pr1,其保存的值类型为int
    std::promise<int> pr1;
    //声明一个std::future对象fu1,并通过std::promise的get_future()函数与pr1绑定
    std::future<int> fu1 = pr1.get_future();
 
    //创建一个线程t1,将函数Thread_Fun1及对象pr1放在线程里面执行
    std::thread t1(Thread_Fun1, std::ref(pr1));
    //创建一个线程t2,将函数Thread_Fun2及对象fu1放在线程里面执行
    std::thread t2(Thread_Fun2, std::ref(fu1));
 
    //阻塞至线程结束
    t1.join();
    t2.join();
 
    return 1;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值