c++多线程:递归调用terminate
c++ multithreading : terminate called recursively
我对C++很陌生,而且已经参与了一个相当复杂的项目。该程序应该下载一个网站以便离线使用。因此,为了让它变得非常简单,我有一个"下载管理器"线程,创建与要下载的页面一样多的"页面下载器"线程。同样,还有一个分析线程树。以下是下载管理器的简化代码:
void DlPage::manageDownload(){
bool end=false;
unique_lock<mutex> dlLck(dlMtx); // dlMtx is part of the shared data
vector<thread*> downloads;
cerr << "Download manager : entering" << endl;
try{
dlLck.lock();
}catch (int e){
cerr << "Download Manager : unique_lock thrown exception: " << e << endl;
exit(1);
}
cerr << "Download manager : mutex locked" << endl;
while(!end){
// wait for a new page to be available for dl
cerr << "Download manager : downloading page " << pageId << endl;
// preparing data structures for download
downloads.push_back(new thread(pageDownload, /*args*/));
end=/*end condition*/;
}
dlLck.unlock();
cerr << "Download manager : mutex unlocked" << endl;
for(i=0;i<downloads.size();i++){
downloads[i]->join();
delete downloads[i];
}
dbgStream() << "Download manager : exiting" << endl;
}
作为输出,我简单地得到:
Download manager : entering
Analyse manager : entering // Analyse manager has the exact same structure as download.
Main : Program launched // First page is added to the shared data and both managers are warned
terminate called recursively // what I don't understand
Aborted
在这一点上,主线程及其2个"管理器"线程在输出确认时成功创建。然后,锁定互斥体,即使应该捕获任何异常,也会导致一切崩溃。更重要的是,它传递了一条在这种情况下不应该出现的错误信息。据我所知,如果程序不能在退出一个函数时销毁每个对象,就会收到这个消息。
谢谢你的帮助,
Jglukn
这会锁定互斥对象:
unique_lock<mutex> dlLck(dlMtx);
这会尝试在同一线程中再次锁定互斥对象,这会引发异常,因为互斥对象已经被锁定:
try{
dlLck.lock();
}catch (int e){
cerr << "Download Manager : unique_lock thrown exception: " << e << endl;
exit(1);
}
catch
子句没有捕获正确的异常类型,因此异常传播到调用方,其结果无法从这里的代码中确定。
相关文章:
- Q维德格特关闭事件(..)未使用 QProcess::terminate() 调用
- 为什么在编译此代码时会出现此错误?(在~之后调用terminate)
- `noexcept`函数中的std :: terminate`调用函数有限-GCC vs clang codegen
- 防止线程在处理异常后在分离时调用 std::terminate()
- C++线程中调用 std::terminate 时程序返回代码
- 如果从类成员初始值设定项引发的异常调用 std::terminate()
- throw() 函数应该总是在异常时展开堆栈并允许捕获异常还是必须调用 std::terminate ?
- 是否可以引入 noreturn noexcept 函数而不是调用 std::terminate
- 错误:调用terminate引发exceptionAbort陷阱:6
- terminate递归调用
- terminate调用了抛出exceptionAbort陷阱:6
- 为什么连VS调试器外启动的程序都不能调用terminate方法呢
- c++多线程:递归调用terminate
- 从 noexcept 函数参数的构造函数引发的异常会立即导致对 std::terminate() 的调用吗?
- 在抛出out_of_range的实例后调用terminate
- 如何修复抛出std::out_of_range实例后调用的terminate
- 为什么即使unexpected handler()抛出指定的异常,仍然调用terminate() ?
- Std::throw_with_nested()在内存不足的情况下调用Std::terminate()
- 谁能告诉我什么时候调用terminate(),什么时候调用unexpected() ?
- 为什么boost::thread的析构函数分离可接合线程,而不是像标准建议的那样调用terminate()