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 一起使用时程序崩溃

QThreadPool 强制停止在 qt cpp

使用 QThreadPool 并行运行单元测试任务

QThreadPool maxThreadCount 在 Application 和 DLL 中不同

为啥即使使用 QThreadPool,GUI 也会冻结?

shared_ptr 与 QThreadPool