C++ 多线程 : terminate called recursively

标签 c++ multithreading

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

关于C++ 多线程 : terminate called recursively,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36515175/

相关文章:

c++ - Boost 的作用域互斥锁和 WinAPI 的临界区有区别吗?

c++ - 重载转换运算符模板

c++ - 最小化和恢复窗体上的小部件

java - 在 Android 上执行长时间运行的任务时选择哪种策略?

c++ - 我如何拆除多线程 C++ 中的观察者关系?

c++ - 暂时禁用特定版本 GCC 的警告

c++ - 小数到任何基数 <17 计算器 c++

Java - 使用 ImageIO 进行多线程处理

c++ - Qt 如何从运行的线程更新主窗口,正确的方法

multithreading - 哪些Qt类直接使用磁盘?