c++多线程:递归调用terminate



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

最新更新