在boost :: thread线程中使用异常

时间:2010-10-11 14:48:45

标签: c++ multithreading boost boost-thread


我开始玩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
*提升v.1.44
*动态链接线程lib的多线程调试DLL版本

2 个答案:

答案 0 :(得分:2)

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

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

非常感谢您的评论

答案 1 :(得分:0)

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

当然,我无法确定你是否正面临这个问题,但从你所描述的那个问题来看,这是一种可能性。

相关问题