promise用于在多个线程间传值,多用于一个线程执行到某个状态后,把自己的信息传递给另外一个线程(该线程在拿到这个信息前,会阻塞等待):
#include#include #include #include #include using namespace std; void init(promise &p) { this_thread::sleep_for(chrono::seconds(1)); cout<<"init ok"< pr1; //相当于一个对将来会被设置一个值的承诺 future fu1 = pr1.get_future(); //每个promise对象都有一个对应的future对象,future对象用于管理未来的值 thread t1 (init, ref(pr1)); auto status = fu1.get(); //在promise赋值前一直阻塞,promise赋值后可以那到对应的值 cout<<"get init status:"< 可以看到t1线程初始化到某个阶段时通过promise赋值,而主线程在promise被赋值前,会一直阻塞在future::get函数上。通过这种方式,可以很好的同步多线程直接的状态及数据。
当然也可以通过使用条件变量的方式达到同样的目的。
不过由于promise/future实际上是模板类,因此可以用于传递更为复杂的对象:
#include#include #include #include #include using namespace std; class A{ public: A(int a):m_a(a) { cout<<"A Construct, this addr:"< 需要指出的是:
- promise允许move语义(右值构造,右值赋值),不允许拷贝(拷贝构造、赋值),future亦然。
- 与promise关联的future只能通过promise::get_future获取,一个promise实例只能与一个future关联共享状态,当在同一个promise上反复调用get_future会抛出future_error异常。
- set_value只能被调用一次,多次调用会抛出std::future_error异常。
- 如果promise直到销毁时,都未设置过任何值,则promise会在析构时自动设置为std::future_error,这会造成future.get抛出std::future_error异常。
- 通过promise::set_exception函数可以设置自定义异常,该异常最终会被传递到future,并在其get函数中被抛出。



