QThreadPool maxThreadCount 在 Application 和 DLL 中不同
Posted
技术标签:
【中文标题】QThreadPool maxThreadCount 在 Application 和 DLL 中不同【英文标题】:QThreadPool maxThreadCount different in Application and DLL 【发布时间】:2017-11-15 20:21:30 【问题描述】:在应用程序中使用 QThreadPool::globalInstance() 时,我可以将最大线程数设置为一个数字(本例中为 50)
QThreadPool::globalInstance()->setMaxThreadCount(50);
稍后我们可以在同一个应用程序中查询并返回 50。但是,如果从同一个应用程序调用的 DLL 中查询 QThreadPool::maxThreadCount(),它会返回最大线程数仅为 12。然后我可以将库中的 maxThreadCount 增加到我想要的任何数字,单独来自应用程序的 maxThreadCount 数。
那么 QThreadPool::globalInstance 是否仅对独立的应用程序和库是全局的?为什么共享同一进程的 Qt DLL 和应用程序不具有相同的全局 QThreadPool?
【问题讨论】:
这意味着我猜想有两个单独的线程池实例。这可能是因为静态变量的线程数被分配给 EXE 和 DLL。那么问题是该项目首先是如何完全联系起来的?有没有办法确保我们在应用中有一个线程池对象? 【参考方案1】:看QThreadPool的实现https://code.woboq.org/qt5/qtbase/src/corelib/global/qglobalstatic.h.html#158 我们可以看到:
QThreadPool *QThreadPool::globalInstance()
return theInstance();
这里定义https://code.woboq.org/qt5/qtbase/src/corelib/thread/qthreadpool.cpp.html#50
Q_GLOBAL_STATIC(QThreadPool, theInstance)
从这里开始,如果你的 dll 和你的 exec 没有与完全相同的 Qt 核心 dll 链接,那么你会遇到问题
【讨论】:
以上是关于QThreadPool maxThreadCount 在 Application 和 DLL 中不同的主要内容,如果未能解决你的问题,请参考以下文章
将 MuparserX 与 QThreadPool 一起使用时程序崩溃