gpt4 book ai didi

c++ - 当一个线程在另一个线程中捕获异常后运行时,进程中止并发出 SIGABRT

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:19 26 4
gpt4 key购买 nike

我有一个退出处理程序线程等待工作线程完成其工作的条件。信号是从工作线程的析构函数完成的。

下面是退出处理线程的代码。

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,并打印了异常信息。现在这个过程没有核心。异常消息与工作线程捕获的异常消息相同。我的问题是,这个线程如何访问另一个线程捕获的异常?它们是否共享一些与异常处理相关的数据结构?

请阐明这一点。很费解..

注意:- 根据堆栈跟踪,调用 run() 后会立即引发 call_unexpected。这加强了我对以某种方式共享异常堆栈或数据的怀疑。但没有找到任何对此行为的引用。

最佳答案

我会回答我自己的问题。在这种情况下发生的事情是在 TaskExitHandler 线程中调用了一个析构函数。此析构函数执行的操作与在主线程中导致异常的操作相同。

由于 TaskExitHandler 线程被设计为不抛出(或者更确切地说是预期的),因此没有 try-catch block ,因此在引发异常时进程中止。

由于析构函数的调用是隐式的,因此它从未显示在堆栈跟踪中,因此很难找到。必须跟踪每个对象才能找到此异常泄漏。

感谢大家的积极参与 :) 这是我第一个得到积极回应的问题..

关于c++ - 当一个线程在另一个线程中捕获异常后运行时,进程中止并发出 SIGABRT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10348193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com