提升异常和线程安全性 - 优于常规异常处理

时间:2014-12-01 19:30:01

标签: c++ multithreading boost exception-handling

我遇到了this文章并说明了(为方便起见,复制粘贴)。我不明白它以及它如何比通常的异常处理更有益。在do_work代码中,error实例作为对新创建的线程的引用传递。现在如果有错误则重新抛出。之后发生了什么?以下方法有什么作用?

error = boost::exception_ptr();
error = boost::current_exception();

这是来自链接

  

使用提升异常的另一个好处是线程安全   能力。它允许在线程之间进行异常   没有问题。

     

例如,这个抛出克隆就绪异常的函数:

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();
    }
}

1 个答案:

答案 0 :(得分:4)

boost::exception_ptr()将默认构造一个异常指针,类似于空指针,这意味着在if-check中它将评估为false,表示没有错误。
boost::current_exception()返回一个异常指针,指向catch子句中的当前活动异常。它基本上捕获异常,以便您可以在if检查中重新抛出它。

作为避免所有这些样板代码的替代方案,我建议使用std::async/boost::async提供所有开箱即用的功能。

我不确定你的意思&#34;正常&#34;异常处理,但这允许你处理呼叫方面的错误,表明你的线程没有完成它应该做的工作。