私はBoost.threadを内部的に使用する共有ライブラリを構築しています。その結果、Boost.sthreadはそれに依存するので、Boost.systemも使用されます。私の共有ライブラリはCインターフェイスをエクスポートするので、私はすべての内部例外処理とスレッド使用法などをエンドユーザーから隠蔽する必要があります。話すにはブラックボックスになっているはずです。しかし、プログラムがうまく動作している間にクライアントアプリケーションにリンクすると、ライブラリ関数を呼び出すことによって処理を停止するとすぐに、私は次のようになります:共有ライブラリ内の内部例外がエンドユーザアプリケーションを終了する
'boost :: thread_interrupted '
私はこの例外をライブラリで内部的にキャッチします。なぜ、実際にキャッチされていないのかわかりません。エンドユーザーのプログラムは、Boost例外を何らかの方法で知り、処理することを目的としたものではありません。共有ライブラリをビルドするときは、Boost.threadとBoost.systemの両方に静的リンクを使用するので、外部の世界はそれらを見ることは決してありません。私はUbuntu 12上でGCC 4.7を使用しています。Windowsでは、このような問題はありません(MSVCまたはMinGwでは問題ありません)。
(EDIT)
私は、コメント内の要求に従って、問題を再現する最小限の例を示すために、質問を編集しています。
最初はtestlib.cppとtestlib.hのコードです。
testlib.cpp:
#include <boost/thread/thread.hpp> void thread_func() { while(1) { boost::this_thread::interruption_point(); } } void do_processing() { // Start a thread that will execute the function above. boost::thread worker(thread_func); // We assume the thread started properly for the purposes of this example. // Now let's interrupt the thread. worker.interrupt(); // And now let's wait for it to finish. worker.join(); }
そして今testlib.h:
私は、次のコマンドを使用して共有ライブラリにこれを構築#ifndef TESTLIB_H #define TESTLIB_H void do_processing(); #endif:
グラム++ -static-libgccの - 静的-s -DNDEBUG -I/usr/boost_1_54_0 -L/usr/boost_1_54_0/stage/lib -Wall -shared -fPIC -o libtestlib.so testlib.cpp -lboost_thread -lboost_system -lpthread -O3
はその後、私は次のように見える些細なクライアントプログラムのコードを持っている:
#include "testlib.h" #include <cstdio> int main() { do_processing(); printf("Execution completed properly.\n"); return 0; }
次のように私はクライアントを構築:
グラム++ -DNDEBUG -Iは/ usr/boost_1_54_0 -L ./私は、クライアントを実行すると-O3
-ltestlib -Wall -oクライアントclient.cppは、私が取得:
を '後押し:: thread_interrupted'
のインスタンスを投げた後に呼び出さTERMINATE 10 Aborted(コアダンプされた)
私は明示的にスレッド中断例外をキャッチしていませんが、Boostのドキュメントに従ってBoost.threadはそれを行い、指定されたスレッドのみを終了します。私は明らかにthread_func関数内から例外をキャッチしようとしましたが、違いはありませんでした。
(EDITの終わり)
(EDIT 2)
それは-fexceptionsをオンにしてもして、それでも問題が解決しないことは注目に値します。また、私は例外をキャッチしてスローするコードと同じ翻訳単位で定義された例外をスローしてキャッチしましたが、改善はありませんでした。要するに、すべての例外は、共有ライブラリに捕捉ハンドラがあるにもかかわらず、共有ライブラリで捕らえられていないように見えます。クライアントファイルとtestlibファイルを単一のプログラムの一部としてコンパイルすると、つまりtestlibを共有ライブラリにしなくても、すべてが期待通りに機能します。
(終了の編集2)
ヒントはありますか?
私は問題を示す***最小限の***テストを作成することをお勧めします(5行のMakefileを考えてください)。 github/gistに載せてください。可能性がありますが、その過程で原因や回避策が見つかります。そうでない場合は、実際に私たちに何かを見せてくれるでしょう。 – sehe
@このようなコメントは無限に、特に 'チャンスはありますか、あなたはそのプロセスの原因/回避策を見つけるでしょう'と言ってください。無数の再生コードを取得しようとしている間に、自分自身で解決することを見つけるために、私はちょうど質問を始めました。 – stijn
@stijn私は知っています。正直言って、私はそれを言いました。なぜなら、今のように、野生の推測のほかに、文字通り他の選択肢がないからです。私は本当にこれを調べるのを手伝っていますが、何も進んでいません。 – sehe