CppUnit 测试在 Qt 5.9 中挂起

CppUnit test hangs with Qt 5.9

将我们的源代码从 Qt 5.6 移植到 Qt 5.9.1 时,使用 CppUnit 1.13.2 进行测试时出现了一个问题:DllPluginTester.exe 在完成所有单元测试后挂起。调试进程时,堆栈显示

CppUnit::DynamicLibraryManager::doReleaseLibrary()

卡在调用 ::FreeLibrary 中,堆栈进一步挂起在 QThread::wait(),即 WaitForSingleObject 永远等待。

有人知道什么会导致这种行为吗?

我找到了导致该问题的原因:c.f。 QTBUG-34460。 我不知道为什么在从 Qt 版本 5.6 移动到 5.9.1 之前没有发现这个问题,因为这个错误已经在版本 5.1.1 中报告过。因此调查需要一些时间。

对于受影响的测试 - 所有这些都涉及某种多线程,例如通过在某处调用 QtConcurrent::run() - 我在每个受影响的测试结束时插入了以下几行作为我的解决方案:

void UnitTestClass::testWithMultithreadingInside
{
  ...
  constexpr auto MAX_WAIT_MS = 5000;
  auto pool = QThreadPool::globalInstance();
  if (pool)
  {
    pool->clear();
    pool->waitForDone(MAX_WAIT_MS);
  }
}