如何在线程之间传递参数和处理异常(也就是线程的高级接口如何实现这一技术)。 如果要传递参数给线程,可以把它当做参数来传递,如果想要线程的运行结果可以通过by reference的方式传递参数。
另外一个用来传递运行结果和异常的机制是使用std::promise,promise对象是future对象配对兄弟,二者都能暂时拥有一个shared state (用来表现一个结果或者异常值),但是future object允许你取回数据,promise是让你提供数据。其中promise的声明位于头文件
在创建promise对象之后,这个对象内部会建立一个shared state用来存放结果值或者异常,并可以被future对象取走并当做线程结果。在传递的时候为了使用by reference,我们可以使用函数std::ref,这样就可以在线程中改变promise对象的shared state。如果promise对象的shared state存有一个结果或者一个异常,其状态还会变成ready。如果想在线程结束时将shared state设置为ready需要用到set_value_at_thread_exit()函数或者set_exception_at_thread_exit()函数,不应使用set_value()或set_exception()函数。
对于promise函数来说,调用get_future()函数仅仅只能够调用一次,调用多次的话会抛出std::future_error。
使用promise的实例代码如下:
1 |
|