【问题标题】:Boost exception and thread safety - benefit over regular exception handling提高异常和线程安全 - 优于常规异常处理
【发布时间】: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


    【解决方案1】:

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

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

    我不确定你所说的“正常”异常处理是什么意思,但这允许你在调用端处理错误,表明你的线程没有完成它应该做的工作。

    【讨论】:

      猜你喜欢
      • 2011-12-31
      • 1970-01-01
      • 2011-04-07
      • 2018-03-06
      • 2017-01-16
      • 2019-12-28
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多