16.5.1  模板类future_error、future_errc和future_categor...

16.5.1 模板类 future_ error、future_ errcfuture_ category以及共享状态

future模板类等也需要进行错误处理。

1.错误处理

此处介绍3种错误处理办法:future_category()、make_error_code()和make_error_condi-tion()。这3个函数的声明形式分别为:

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

这3个函数的使用方法参见例16-17。

例16-17

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

例16-17的执行效果如图16-17所示。

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

图16-17 例16-17的执行效果

2.类future_error

类future_error是从logic_error派生而来的。其声明形式如下:

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

除了构造函数之外,该类仅包含两个成员函数:code()和what()。

成员函数code()的声明形式如下:

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

其作用是:返回传递给其构造函数的参数值。该参数值是在构造该类对象时传入的。

成员函数what()的声明如下:

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

其作用是:返回异常的描述信息。

例16-18

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

例16-18的执行效果如图16-18所示。

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

图16-18 例16-18的执行效果

3.类future_errc

类future_errc是一个枚举类。其枚举值的对应表见表16-1。

6-1future-errc枚举值的对应表

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

4.共享状态

本章讲述的各种类在多数情况下是使用某个状态进行交流数据结果的,这个状态即共享状态。共享状态包含一些状态信息和一些结果,也可能是一些数值或是一种异常。

通常异步的返回对象是一种可以从“共享状态”中读取返回值得对象。一种异步返回对象的等待函数是一种共享数据的阻塞等待。如果等待函数是因超时而返回的,该函数即变成时间等待函数。

异步提供者是一种给共享状态提供结果的对象。该共享状态的结果是通过相关函数设定的。设置这些共享状态的意义在于可以描述之前创建的状态对象。

当异步返回对象或者异步提供者用于释放其共享状态,这意味着:

1)若返回对象或提供者保持最后的共享状态的引用,共享状态被破坏。

2)返回的对象或者提供者放弃该共享状态的引用。

若异步提供者用于创建共享状态,这意味着:①提供者标记该状态为“ready”;②提供者不阻塞任意执行线程,而该线程希望等待其共享状态变为“ready”状态。

当异步提供者用于放弃它的共享状态,这意味着:

1)如果该状态没有变为ready,提供者会存储一个异常对象,并使其共享状态为ready状态。

2)提供者释放共享状态。

如果该共享状态能保持一个数值,或一种异常需要返回,该共享状态将是ready。等待一个共享状态直到其变为ready,可能会激活代码而计算等待线程的结果。

某函数调用(其存储共享状态的结果)将和另一个函数调用(检测到ready状态,并导致设置)同步共享状态的等待函数成功返回之后,共享状态的存储会同步进行。

某些函数延时创建共享状态为ready,直至正在运行的线程退出。在等待共享状态为ready之前,每个线程存储对象的破坏是有序的。

同一共享状态的结果的访问还有可能会发生冲突。