我发现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
?
答案 0 :(得分:0)
一个关键的区别可能是标准库packaged_task可能是静态链接的,而boost :: thread版本是动态链接的。
跨动态库边界抛出异常可能并不总是有效,特别是当源代码没有使用完全相同的编译器选项进行编译时。
你可以