1


私は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 に対する動的リンク スレッド ライブラリのバージョン

4

2 に答える 2

2

私は問題を見つけました:それは3.17より新しいminGWバージョンで作業しているときにのみ発生するブーストライブラリのバグです。ブーストトラックチケット#4258

提案された回避策を適用し、プリプロセッサ定義BOOST_THREAD_USE_LIBを設定した後、静的ライブラリに対してリンクできるようになりました。例外をスローするのと同じスレッドでキャッチされている限り、例外を処理できます。

あなたのコメントのためにあなたを非常にタンクします

于 2010-10-12T08:12:21.390 に答える
0

複数の共有ライブラリから構成されるアプリケーションでは、例外の可視性に関して非常に注意する必要がある場合があります。デフォルトでは、gcc は例外の RTTI 情報を共有ライブラリの外部から見えるようにしないため、共有ライブラリの境界を越えてスローされた例外が「消えて」しまいます。詳細な説明と考えられる落とし穴については、こちらを参照してください。

確かに、あなたがこの問題に直面しているとは確信できませんが、あなたが説明したことから、可能性はあります。

于 2010-10-12T01:45:26.233 に答える