【发布时间】:2015-01-29 21:25:33
【问题描述】:
我遇到了this 文章,它指出(为方便起见,复制粘贴)。我不明白它以及它如何比通常的异常处理更有益。在do_work 代码中,error 实例作为对新创建线程的引用传递。现在,如果有错误,它会被重新抛出。之后发生了什么?以下方法有什么作用?
error = boost::exception_ptr();
error = boost::current_exception();
来自链接
使用 boost 异常的另一个好处是线程安全 能力。它允许异常在线程之间结转 没有问题。
例如这个函数会抛出一个可克隆的异常:
void do_work() { boost::exception_ptr error; boost::thread t( boost::bind(worker_thread,boost::ref(error)) ); t.join(); if( error ) boost::rethrow_exception(error); }可以被截获并克隆以被另一个线程携带 安全,例如:
#include <boost/exception_ptr.hpp> #include <boost/thread.hpp> #include <boost/bind.hpp> void do_work(); //throws cloning-enabled boost::exceptions void worker_thread( boost::exception_ptr & error ) { try { do_work(); error = boost::exception_ptr(); } catch(...) { error = boost::current_exception(); } }
【问题讨论】:
标签: c++ multithreading boost exception-handling