我想使用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调试和发布版本都可以正常工作。微软的编译器是否有一些细微差别导致这种情况,或者我的程序是否错误?
答案 0 :(得分:0)
我找到了解决这个问题的方法,虽然不是一个干净的解决方案。定义宏mup::IToken::~IToken()
时,MUP_LEAKAGE_REPORT
发生错误。宏(在调试版本中自动定义)以非线程安全的方式调用静态成员,从而引发迭代器错误。简单的解决方案是只注释掉定义宏的行。在我的MuparserX版本中,它位于mpDefines.h,第100行:
#define MUP_LEAKAGE_REPORT
据我所知,该宏仅用于调试MuparserX,对解析器的行为没有任何影响。