C++11 中std::promise 介绍
前面两讲《C++11并发指南二(std::thread详解)》,《C++11并发指南三(std::mutex详解)》分别介绍了std::thread和std::mutex,相信读者对C++11中的多线程编程有了一个最基本的认识,本文将介绍C++11标准中
- Providers类:std::promise,std::package_task
- Futures类:std::future,shared_future.
- Providers函数:std::async()
- 其他类型:std::future_error,std::future_errc,std::future_status,std::launch.
std::promise类介绍
promise对象可以保存某一类型T的值,该值可被future对象读取(可能在另外一个线程中),因此promise也提供了一种线程同步的手段。在promise对象构造时可以和一个共享状态(通常是std::future)相关联,并可以在相关联的共享状态(std::future)上保存一个类型为T的值。
可以通过get_future来获取与该promise对象相关联的future对象,调用该函数之后,两个对象共享相同的共享状态(sharedstate)
- promise对象是异步Provider,它可以在某一时刻设置共享状态的值。
- future对象可以异步返回共享状态的值,或者在必要的情况下阻塞调用者并等待共享状态标志变为ready,然后才能获取共享状态的值。
下面以一个简单的例子来说明上述关系
#include//std::cout #include //std::ref #include //std::thread #include //std::promise,std::future voidprint_int(std::future &fut){ intx=fut.get();//获取共享状态的值. std::cout<<"value:"< prom;//生成一个std::promise 对象. std::future fut=prom.get_future();//和future关联. std::threadt(print_int,std::ref(fut));//将future交给另外一个线程t. prom.set_value(10);//设置共享状态的值,此处和线程t保持同步. t.join(); return0; }
std::promise构造函数
default(1) |
promise(); |
---|---|
withallocator(2) |
template |
copy[deleted](3) |
promise(constpromise&)=delete; |
move(4) |
promise(promise&&x)noexcept; |
- 默认构造函数,初始化一个空的共享状态。
- 带自定义内存分配器的构造函数,与默认构造函数类似,但是使用自定义分配器来分配共享状态。
- 拷贝构造函数,被禁用。
- 移动构造函数。
另外,std::promise的operator=没有拷贝语义,即std::promise普通的赋值操作被禁用,operator=只有move语义,所以std::promise对象是禁止拷贝的。
例子:
#include//std::cout #include //std::thread #include //std::promise,std::future std::promise prom; voidprint_global_promise(){ std::future fut=prom.get_future(); intx=fut.get(); std::cout<<"value:"< ();//prom被move赋值为一个新的promise对象. std::threadth2(print_global_promise); prom.set_value(20); th2.join(); return0; }
std::promise::get_future介绍
该函数返回一个与promise共享状态相关联的future。返回的future对象可以访问由promise对象设置在共享状态上的值或者某个异常对象。只能从promise共享状态获取一个future对象。在调用该函数之后,promise对象通常会在某个时间点准备好(设置一个值或者一个异常对象),如果不设置值或者异常,promise对象在析构时会自动地设置一个future_error异常(broken_promise)来设置其自身的准备状态。上面的例子中已经提到了get_future,此处不再重复。
std::promise::set_value介绍
generictemplate(1) |
voidset_value(constT&val); voidset_value(T&&val); |
---|---|
specializations(2) |
voidpromise |
设置共享状态的值,此后promise的共享状态标志变为ready.
std::promise::set_exception介绍
为promise设置异常,此后promise的共享状态变标志变为ready,例子如下,线程1从终端接收一个整数,线程2将该整数打印出来,如果线程1接收一个非整数,则为promise设置一个异常(failbit),线程2在std::future::get是抛出该异常。
#include//std::cin,std::cout,std::ios #include //std::ref #include //std::thread #include //std::promise,std::future #include //std::exception,std::current_exception voidget_int(std::promise &prom){ intx; std::cout<<"Please,enteranintegervalue:"; std::cin.exceptions(std::ios::failbit);//throwonfailbit try{ std::cin>>x;//setsfailbitifinputisnotint prom.set_value(x); }catch(std::exception&){ prom.set_exception(std::current_exception()); } } voidprint_int(std::future &fut){ try{ intx=fut.get(); std::cout<<"value:"< prom; std::future fut=prom.get_future(); std::threadth1(get_int,std::ref(prom)); std::threadth2(print_int,std::ref(fut)); th1.join(); th2.join(); return0; }
std::promise::set_value_at_thread_exit介绍
设置共享状态的值,但是不将共享状态的标志设置为ready,当线程退出时该promise对象会自动设置为ready。如果某个std::future对象与该promise对象的共享状态相关联,并且该future正在调用get,则调用get的线程会被阻塞,当线程退出时,调用future::get的线程解除阻塞,同时get返回set_value_at_thread_exit所设置的值。注意,该函数已经设置了promise共享状态的值,如果在线程结束之前有其他设置或者修改共享状态的值的操作,则会抛出future_error(promise_already_satisfied)。
std::promise::swap介绍
交换promise的共享状态。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。