【问题标题】:Does the future generated from boost::packaged_task throw wrong exception?boost::packaged_task 生成的未来会抛出错误的异常吗?
【发布时间】:2014-11-05 06:44:45
【问题描述】:

我发现 boost::packaged_task 和 std::packaged_task 之间存在明显不同的行为。我测试了boost版本1.55和1.56,c++11编译器是Visual Studio 2013和gcc(in XCode)。

即从packaged_task::get_future()生成的future调用get()会发出不同的异常。

这是我的简单代码:

#include <boost/thread/future.hpp>
#include <future>
#include <iostream>

struct my_error {};

void throw_something()
{
    throw my_error();
}

int main()
{
    typedef boost::packaged_task<void> packaged_task;

    packaged_task task(throw_something);
    auto fu = task.get_future();
    task();

    try {

        fu.get();

        std::cout << "no exception" << std::endl;
    }
    catch (const my_error&) {
        std::cout << "catch my_error" << std::endl;
    } catch (const std::exception &e) {
        std::cout << "catch std::exception: " << e.what() << std::endl;
    } catch (...) {
        std::cout << "catch unknown error" << std::endl;
    }

    std::system("pause");
    return 0;
}

在 Visual Studio 2013 中,结果是:catch std::exception: Unknown exception

在 gcc(在 XCode 中)是:catch std::exception: std::exception

但是如果我把packaged_task的类型改成Visual Studio 2013或者gcc提供的c++11,那就是:

 typedef std::packaged_task<void()> packaged_task;

结果变差:catch my_error

我认为std::packaged_task 工作正常,因为我可以捕捉到真正的类型。我会误用boost::packaged_task吗?

【问题讨论】:

    标签: c++ c++11 boost


    【解决方案1】:

    一个关键的区别可能是标准库 packaged_task 可能是静态链接的,而 boost::thread 版本是动态链接的。

    跨动态库边界抛出异常可能并不总是有效,尤其是当源代码未使用完全相同的编译器选项编译时。

    你可以

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 2011-07-12
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多