【问题标题】:Using exceptions within a boost::thread thread在 boost::thread 线程中使用异常
【发布时间】:2010-10-11 14:48:44
【问题描述】:


我开始玩 boost::threads,但我有点被这个问题困住了:

我不明白为什么这个程序会在抛出异常后立即崩溃,因为我试图在线程中捕获它。我认为只要处理发生在与抛出相同的线程中,就可以处理异常?

#include <boost/thread.hpp>
#include <exception>

using namespace std;

void doWork();
void thrower();

int main( int argc, char** argv ){
 boost::thread worker(doWork);
 worker.join();
 return 0;
}

void doWork(){
 try{
    thrower();
 }
 catch( const exception &e ){
  //handle exception
 }
}
void thrower(){
 // program terminates as soon as the exception is thrown
 throw exception();
}

附加信息:
*使用 MinGW32
*Boost v.1.44
*针对线程库的多线程调试dll版本动态链接

【问题讨论】:

  • 如果没有正确的前向声明和using namespace std,这甚至无法编译。但如果我添加这些,它在 Ubuntu Linux w/Boost 1.40 上运行良好。
  • 对不起,这是代码的简化版本,用于显示问题。你是静态链接还是动态链接?
  • 对我也很好。 Mac OS X 使用 Boost 1.44 动态链接。
  • 感谢您的测试,这让我不知道下一步该做什么。我一直在尝试所有我能找到的编译器/链接器选项来让这个该死的小东西运行
  • @zitroneneis:用于构建 Boost.Threads 库的 g++ 是否与您用于构建程序的 g++ 具有相同的 ABI?

标签: c++ multithreading boost boost-thread


【解决方案1】:

我发现了问题: 这是 boost 库中的一个错误,仅在使用高于 3.17 的 minGW 版本时才会出现。 Boost trac ticket #4258

在应用建议的解决方法并设置预处理器定义后BOOST_THREAD_USE_LIB我现在可以链接到静态库,并且我可以处理异常,只要它们被捕获抛出它们的线程。

非常感谢您的 cmets

【讨论】:

    【解决方案2】:

    在由多个共享库组成的应用程序中,您可能必须非常小心地查看异常的可见性。默认情况下,gcc 不会使异常的 RTTI 信息从共享库的外部可见,从而导致跨共享库边界抛出的异常“消失”。有关详细说明和可能的陷阱,请参阅 here

    当然,我不能确定您是否面临这个问题,但根据您的描述,这是一种可能性。

    【讨论】:

    • 哇,真是有趣的东西。对我来说幸运的是,这不是我的问题。无论如何,非常感谢你的想法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多