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 templatevoid 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对象的共享状态