我对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
子句没有捕获正确的异常类型,因此异常传播到调用方,其结果无法从这里的代码中确定。