将MuparserX与QThreadPool一起使用时程序崩溃

时间:2017-09-21 18:59:49

标签: c++ qt visual-c++ qthread muparser

我想使用QThreadPool同时运行多个MuparserX解析器。这是代码:

#include <iostream>
#include <QRunnable>
#include <QThreadPool>
#include "mpParser.h"

struct Task: public QRunnable {
    void run() override {
        //Create a new parser
        mup::ParserX p;
    }
};

int main(int argc, char *argv[])
{
    for (int i = 0; i != 10; ++i)
        QThreadPool::globalInstance()->start(new Task);

    while (QThreadPool::globalInstance()->activeThreadCount() > 0) {}

    return 0;
}

但是,我的程序在析构函数mup::ParserX::~ParserX()中崩溃时出现“list iterators incompatible”或“list iterator not dereferencable”错误。这仅在MSVC13和15中发生,并且仅在调试版本中发生;发布版本运行没有错误并产生预期的输出。 GCC调试和发布版本都可以正常工作。微软的编译器是否有一些细微差别导致这种情况,或者我的程序是否错误?

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法,虽然不是一个干净的解决方案。定义宏mup::IToken::~IToken()时,MUP_LEAKAGE_REPORT发生错误。宏(在调试版本中自动定义)以非线程安全的方式调用静态成员,从而引发迭代器错误。简单的解决方案是只注释掉定义宏的行。在我的MuparserX版本中,它位于mpDefines.h,第100行:

  #define MUP_LEAKAGE_REPORT

据我所知,该宏仅用于调试MuparserX,对解析器的行为没有任何影响。