boost :: async()的异常会丢失类型

时间:2017-07-20 03:30:56

标签: c++ boost c++14 boost-thread stdasync

Boost版本:1.61,GCC版本6.2.0,C ++ 14

boost::async()调用中的异常似乎丢失了类型,而它与std::async一起正常工作。 std::asyncboost::async我之间是否存在根本区别?

以下代码有效(使用std::async):

#include <iostream>
#include <stdexcept>
#include <future>

using namespace std;

struct MyException : std::exception {
  const char* what() const noexcept override { return "message"; }
};

int main() {
  try {
    auto future = std::async(std::launch::async, [] { throw MyException(); });
    future.get();
  } catch (const MyException& e) {
    cout << "MyException caught. Message: " << e.what() << endl;
  } catch (const std::exception& e) {
    cout << "std::exception caught. Message: " << e.what() << endl;
  }
}

和输出

$ g++ test.cpp -std=c++14 -lpthread -lboost_thread -lboost_system && ./a.out
MyException caught. Message: message

但是,以下代码(仅使用boost::async而不是std::async相同)不能按预期工作:

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

using namespace std;

struct MyException : std::exception {
  const char* what() const noexcept override { return "message"; }
};

int main() {
  try {
    auto future = boost::async(boost::launch::async, [] { throw MyException(); });
    future.get();
  } catch (const MyException& e) {
    cout << "MyException caught. Message: " << e.what() << endl;
  } catch (const std::exception& e) {
    cout << "std::exception caught. Message: " << e.what() << endl;
  }
}

输出:

$ g++ test.cpp -std=c++14 -lpthread -lboost_thread -lboost_system && ./a.out
std::exception caught. Message: std::exception

它也不适用于boost::future::then延续:

#include <iostream>
#include <stdexcept>
#define BOOST_THREAD_VERSION 4
#include <boost/thread/future.hpp>

using namespace std;

struct MyException : std::exception {
  const char* what() const noexcept override { return "message"; }
};

int main() {
  try {
    auto future = boost::make_ready_future(3).then([](boost::future<int>) -> int { throw MyException(); });
    future.get();
  } catch (const MyException& e) {
    cout << "MyException caught. Message: " << e.what() << endl;
  } catch (const std::exception& e) {
    cout << "std::exception caught. Message: " << e.what() << endl;
  }
}

输出:

$ g++ test.cpp -std=c++14 -lpthread -lboost_thread -lboost_system && ./a.out
std::exception caught. Message: std::exception

因此,当越过线程边界时,异常的具体类型似乎丢失了。但是,它似乎与线程无关,因为根据我的测试,std::launch::deferred(工作正常)和boost::launch::deferred(失去异常类型)也是如此。

0 个答案:

没有答案