1


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

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

#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 线程库的版本

4

2 回答 2

2

我发现了问题:这是 boost 库中的一个错误,仅在使用比 3.17 更新的 minGW 版本时才会出现。提升跟踪票 #4258

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

非常感谢您的评论

于 2010-10-12T08:12:21.390 回答
0

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

当然,我不能确定你是否面临这个问题,但从你描述的情况来看,这是一种可能性。

于 2010-10-12T01:45:26.233 回答