首页 > 编程语言 >C++多线程:promise

C++多线程:promise

时间:2024-11-01 19:58:26浏览次数:2  
标签:std set C++ include future promise promi 多线程

头文件包含:
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对象的共享状态

标签:std,set,C++,include,future,promise,promi,多线程
From: https://www.cnblogs.com/sgqmax/p/18521175

相关文章

  • C++多线程:package_task
    std::packaged_taskstd::packaged_task包装一个可调用对象,并允许获取该可调用对象计算的结果,可调用对象内部包含两个基本元素:1.被包装的任务任务是一个可调用对象,如函数指针或函数对象,该对象的执行结果会传递给共享状态2.共享状态用于保存任务的返回结果,并可通过future对象异......
  • C++标准库:chrono
    ratio先看一下ratio的定义template<intmax_tN,intmax_tD=1>classratio;ratio是由非类型参数定义的模板,用来定义一个比率N/D,如ratio<1,-2>表示-0.5标准库中定义的常用ratio类型typedefinition说明ratio<1,1000>std::milli1/1000ratio<1,1000000>std::mic......
  • C++标准库:random
    随机数生成设备随机数生成设备random_device,生成非确定性随机数,在Linux中通过读取/dev/urandom设备,Windows中使用rand_s重载了()运算符,每次调用会生成一个min()到max()之间的高质量随机数种子,若在Linux(UnixLike)下,可以使用这个生成高质量的随机数,可以理解为真随机数,windows下......
  • Chromium 中chrome.topSites扩展接口定义c++
    一、chrome.topSites使用 chrome.topSites API访问新标签页上显示的热门网站(即最常访问的网站)。不包括用户自定义的快捷方式。权限topSites您必须声明“topSites”扩展程序清单中授予使用此API的权限。{ "name":"Myextension", ... "permissions":[ ......
  • 06程序IPO模式与C++顺序结构
    一、程序IPO模式编程IPO是指输入、处理和输出(Input,Process,Output)的概念。在计算机编程中,IPO是一种常用的设计模式,用于描述程序的基本流程。具体来说,IPO指的是程序从接受输入数据开始,经过一系列处理计算,最终产生输出结果的过程。IPO模式的组成部分:-输入(Input):在这个阶段......
  • 复合结构(C++ Primer)
    复合结构(C++Primer)使用结构体和string使用结构体示例代码:#include<iostream>#include<string>usingnamespacestd;structperson{stringfn;stringsn;chargrade;intage;};intmain(){person*a=newperson;cout<<"what......
  • 【C++】——高效构建与优化二叉搜索树
    活着就意味必须要做点什么,请好好努力。——村上春树《地下》目录1、二叉搜索树BST1.1什么是二叉搜索树1.2BST的性能功能分析2、二叉搜索树的实现2.1BST框架2.2BST插入2.3BST搜索2.4BST删除2.5BST细节问题3、二叉搜索树遍历3.1中序遍历3.2前序遍历3.3......
  • UEC++中的GetClass和StaticClass函数
    GetClass()用途:GetClass() 是 UObject 类的一个实例方法,用于获取调用它的对象的类信息。返回类型:返回 UClass*,即指向调用对象的类的 UClass 对象的指针。使用场景:当你有一个 UObject 或其子类的实例,并且想要获取这个实例所属类的信息时,你会使用 GetClass()。例......
  • UEC++ UClass类
    一、UClass的定义与功能UClass是虚幻引擎中实现反射机制的关键部分,它允许引擎在运行时动态地查询和操作类的信息。每个UClass都保留了一个称作“类默认对象(ClassDefaultObject,简称CDO)”的模板对象,这个对象由类的构造函数生成,并且之后不会被修改。UClass和CDO都可以为特定对......
  • 题解 洛谷 Luogu P1308 [NOIP2011 普及组] 统计单词数 C++
    题目传送门:P1308[NOIP2011普及组]统计单词数-洛谷|计算机科学教育新生态https://www.luogu.com.cn/problem/P1308getline() 会清除使当次getline() 终止的换行,而cin 不会因此cin 以换行终止,之后还需要getline()的话,需要用getchar() 吞换行Linux的一些相......