从boost :: packaged_task生成的未来会抛出错误的异常吗?

时间:2014-11-05 06:44:46

标签: c++ c++11 boost

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

也就是说,get()生成的future的调用packaged_task::get_future()会发出不同的异常。

这是我的简单代码:

#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:未知异常

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

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

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

结果变得不同:抓住my_error

我认为std::packaged_task正常工作,因为我可以抓住真正的类型。我是否滥用boost::packaged_task

1 个答案:

答案 0 :(得分:0)

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

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

你可以