2

升压版本: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(丢失异常类型)也是如此。

4

0 回答 0