C++多线程:promise

头文件包含:
Providers类

  • std::promise
  • std::packaged_task

Futures类

  • std::future
  • std::shared_future

Providers函数

  • std::async()

其他类型

  • std::future_error
  • std::future_errc
  • std::future_status
  • std::launch

std::promise

用来保存某一类型T的值,该值可以被future对象获取,因此promise也提供了一种线程同步的方式

构造函数

  • 默认构造函数
    promise()初始化一个空的共享状态
  • 自定义内存分配器的构造函数
    template<class Alloc>
    promise(allocator_arg_t aa, const Alloc& alloc)
    

拷贝构造函数

promise(const promise&)=delete;

被禁用,promise对象不可拷贝

移动构造函数

promise(promise&&)noexcept;

std::promise对象与关联的std::future进行共享数据,代码如下:

#include<iostream>
#include<functional>
#include<thread>
#include<future>
void printInt(std::future<int>& fut){
    int x= fut.get();
    std::cout<<"value:"<<x<<std::endl;
}
int main(){
    std::promise<int> promi;
    std::future<int> fut= promi.get_future();

    std::thread t(printInt, std::ref(fut));

    promi.set_value(10);

    t.join();

    return 0;
}

fut.get()异步返回共享状态的值,或在必要时阻塞调用者线程并等待共享状态标志变为ready

移动赋值

std::promise<int> promi;
promi= std::promise<int>(); // 移动赋值

常用函数

  • std::promise::get_future()
    获取与promise对象关联的future对象,两个对象间可以传递值或异常对象
    在调用该函数后,promise对象通常会在某个时间传递值,若不设置值或异常,则在析构时,会自动设置一个future_error异常对象来传递自身状态

  • std::promise::set_value()
    generic template

    void set_value(const T& val)
    void set_value(T&& val)
    

    specializations

    void promise<R&>::set_value(R&)
    void promise<void>::set_value(void)
    

    异步地向共享状态传递值,promise对象状态变为ready

  • std::promise::set_exception()
    异步向共享状态设置异常对象,promise对象状态变为ready
    示例如下:

    #include<iostream>
    #include<functional>
    #include<thread>
    #include<future>
    #include<exception>
    
    void getInt(std::promise<int>& promi){
      int x;
      std::cout<<"enter an integer value:";
      std::cin.exceptions(std::ios::failbit); // throw on failbit
      try{
        std::cin>>x; // set failbit if input not int
        promi.set_value(x);
      }catch(std::exception){
        promi.set_exception(std::current_exception());
      }
    }
    
    void printInt(std::future<int>& fut){
      try{
        int x= fut.get();
        std::cout<<"value:"<<x<<std::endl;
      }catch(std::exception& e){
        std::cout<<"exception caught:"<<e.what()<<std::endl;
      }
    }
    
    int main(){
      std::promise<int> promi;
      std::future<int> fut= promi.get_future();
      std::thread t1(getInt, std::ref(promi));
      std::thread t2(printInt, std::ref(fut));
      t1.join();
      t2.join();
    
      return 0;
    }
    
  • std::promise::set_value_at_thread_exit()
    设置共享状态的值,但不将共享状态设为ready,当线程退出时,promise对象自动设置为ready
    当promise对象所在线程退出时,会唤醒阻塞在future.get()的线程,并返回set_value_at_thread_exit()设置的值
    该函数已经设置了共享状态的值,若在线程结束前有其他设置或修改共享状态的操作,则会抛出future_error(promise_already_satisfied)异常

  • std::promise::swap()
    交换promise对象的共享状态

posted @ 2024-11-01 20:09  sgqmax  阅读(11)  评论(0编辑  收藏  举报