ワーカースレッドが作業を行うための条件を待機している出口ハンドラースレッドがあります。シグナリングは、ワーカースレッドのデストラクタから行われます。
以下は、出口ハンドラスレッドのコードです。
void Class::TaskExitHandler::run() throw()
{
while( ! isInterrupted() ) {
_book->_eot_cond.wait(); // Waiting on this condition
{
CLASS_NAMESPACE::Guard<CLASS_NAMESPACE::FastLock> eguard(_book->_exitlist_lock);
list<TaskGroupExecutor*>::const_iterator itr = _book->_exited_tasks.begin();
for( ; itr != _book->_exited_tasks.end(); itr++ ) {
(*itr)->join();
TRACER(TRC_DEBUG)<< "Deleting exited task:" << (*itr)->getLoc() << ":"
<< (*itr)->getTestID() << ":" << (*itr)->getReportName() << endl;
delete (*itr);
}
_book->_exited_tasks.clear();
}
_book->executeAny();
}
}
}
ここで、ワーカースレッドが(下位層から発生した)例外をキャッチすると、このスレッドは続行され、すぐに終了コード134(SIGABRT)でコアリングされることが確認されています。
スタックトレースは次のとおりです-
#0 0x0000005555f49b4c in raise () from /lib64/libc.so.6
#1 0x0000005555f4b568 in abort () from /lib64/libc.so.6
#2 0x0000005555d848b4 in __gnu_cxx::__verbose_terminate_handler () from /usr/lib64/libstdc++.so.6
#3 0x0000005555d82210 in ?? () from /usr/lib64/libstdc++.so.6
#4 0x0000005555d82258 in std::terminate () from /usr/lib64/libstdc++.so.6
#5 0x0000005555d82278 in ?? () from /usr/lib64/libstdc++.so.6
#6 0x0000005555d81b18 in __cxa_call_unexpected () from /usr/lib64/libstdc++.so.6
#7 0x0000000120047898 in Class::TaskExitHandler::run ()
#8 0x000000012001cd38 in commutil::ThreadBase::thread_proxy ()
#9 0x0000005555c6e438 in start_thread () from /lib64/libpthread.so.0
#10 0x0000005555feed6c in __thread_start () from /lib64/libc.so.6
Backtrace stopped: frame did not save the PC
したがって、「throw()」仕様を使用して例外をスローしないことを指定するこのrun()関数は、(フレーム4から)例外を発生させるようです。__cxa_call_unexpected()に関するさまざまな参照に従って、スタックトレースは、「throw()」仕様の関数で例外が発生したときに中止するコンパイラの一般的な動作を示しています。問題の分析は正しいですか?
テストするために、このメソッドにtry catchを追加し、例外メッセージを出力しました。今、プロセスはコアではありませんでした。例外メッセージは、ワーカースレッドによってキャッチされたものと同じでした。私の質問は、このスレッドが他のスレッドによってキャッチされた例外にどのようにアクセスできるかということです。それらは、例外処理に関連するいくつかのデータ構造を共有していますか?
これに少し光を当ててください。かなり不可解です。
注:-stacktraceに従って、run()が呼び出された直後にcall_unexpectedが発生します。それは、どういうわけか例外スタックまたはデータが共有されているという私の疑問を強めます。しかし、この振る舞いへの言及は見つかりませんでした。