首页 理论教育 C++STL标准模板库精解:版本的模板类promise

C++STL标准模板库精解:版本的模板类promise

时间:2023-10-25 理论教育 版权反馈
【摘要】:简而言之,该函数的调用就是建立promise类型对象和future类型对象之间的关系。该函数为promise类型对象设置异常,之后promise类型对象的共享状态标志变为ready。该promise类型对象会自动设置为ready。下面以例16-19详述类promise的使用方法。

C++STL标准模板库精解:版本的模板类promise

类promise的声明形式如下:

978-7-111-51399-5-Chapter16-87.jpg

978-7-111-51399-5-Chapter16-88.jpg

由以上内容可知,该类包含4个构造函数、1个返回其值的get_future()函数以及4个设置其值的(set_value()函数、set_exception()、set_value_at_thread_exit()(两种形式)和set_exception_at_thread_exit())。

命名空间std中还包含两个相关的算法函数。

在C++ 11的联机帮助中,该类的模板也有3种形式:

•template<class T>promise;

•template<class R&>promise<R&>;

•template< >promise<void>;

其实promise类的对象可以存储相关类型的数值,并作为一种同步的点。在其构造函数中,promise类型对象是和一种新的共享状态相关联的,这些对象可以存储一个数值或者一个异常(该异常需要是从exception类派生而来)。

通过调用get_future()函数,这个共享状态可以是和某future类型对象相关联。调用之后两个对象可以共享同一个共享对象。

1)promise类型对象是异步提供者,并期望在某点设置该共享状态的数值。

2)future类对象是一个异步返回对象,该对象可以返回共享状态的值,并等待其变为“ready”状态。

共享状态的生命期至少会持续到最后一个对象释放,或者最后一个对象被迫破坏掉。因此,如果它关联到某future对象时,它可以挽救该promise类型对象,并首先获得该对象。

各成员函数的功能分别介绍如下:

1)getfuture()函数。该函数返回一个future类型对象,该对象对应关联一个共享状态。该future类型对象可以访问共享状态中存储的数值或者异常,其值是通过promise类型对象设置的。对于每个prmise类型共享装状态,仅仅可以返回一个future类型对象。该函数调用之后,promise类型对象期望创建共享状态为ready。而设置共享状态为ready,需要通过设置一个数值或者一个异常。否则,promise对象在析构时会自动地设置一个future_error异常(broken_promise)来设置其自身的ready状态。简而言之,该函数的调用就是建立promise类型对象和future类型对象之间的关系。(www.xing528.com)

2)setexception()函数。该函数为promise类型对象设置异常,之后promise类型对象的共享状态标志变为ready。

3)setvalue()函数。该函数为prmise类型对象设置共享状态的值,之后promise类型对象的共享状态标志变为ready。

4)set_value_at_thread_exit()函数。该函数用于设置共享状态的值,但是不将共享状态标识设置为ready。当线程退出时。该promise类型对象会自动设置为ready。若某个std::fu-ture对象与该promise对象的共享状态相关联,并且该future正在调用get,则调用get的线程会被阻塞。当线程退出时,调用future::get的线程解除阻塞,同时get返回set_value_at_thread_exit所设置的值。注意:该函数已经设置了promise共享状态的值,若在线程结束之前有其他设置或者修改共享状态的值的操作,则会抛出future_error(promise_already_satis-fied)。

5)set_exception_at_thread_exit()函数。该函数用于设置一个异常指针给共享状态,并不立即将共享状态设置为ready。当该线程退出时,该函数会自动将promise类型对象的共享状态标志设置为ready。

下面以例16-19详述类promise的使用方法。

注意:程序的使用分两次进行,所以包含两个效果图。

例16-19

978-7-111-51399-5-Chapter16-89.jpg

978-7-111-51399-5-Chapter16-90.jpg

978-7-111-51399-5-Chapter16-91.jpg

例16-19的执行效果如图16-19和图16-20所示。

978-7-111-51399-5-Chapter16-92.jpg

图16-19 例16-19的执行效果1

978-7-111-51399-5-Chapter16-93.jpg

图16-20 例16-19的执行效果2

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈