QThread::idealThreadCount() 总是返回“2”

QThread::idealThreadCount() always returning "2"

我需要在 QSpinBox 中显示 CPU 具有的核心数或线程数。问题是:

QThread cpuInfo(this); //get CPU info
ui->spnBx_nmb_nodes->setValue(cpuInfo.idealThreadCount()); //get thread count

这总是返回“2”。我在“2 cores/4 threads”笔记本中试过;一台“4 cores/8 线程”计算机和一台“12 核/24 线程”服务器。在所有情况下,这将返回“2”作为理想的线程数。

有人可以给我一些启发吗?

idealThreadCount() 的实现在不同的 OS 上是不同的:

在 Windows 上,QThread::idealThreadCount() 调用 Win32 函数 GetNativeSystemInfo(),从其结果中,returns 来自 SYSTEM_INFOdwNumberOfProcessors 值调用填充的结构。

在 Linux(和大多数其他 Unix-y OS)上,QThread::idealThreadCount() 调用 sysconf(_SC_NPROCESSORS_ONLN) 和 returns 该值。

在 MacOS/X(以及 BSD 和 iOS)上,QThread::idealThreadCount() 调用 sysctl(CTL_HW, HW_NCPU) 和 returns 从那里接收的值。

QThread::idealThreadCount() 还包含其他一些不太常用的 OS 的后端实现,我不会在这里总结;如果您需要自己寻找,代码在 lines 461-515 of qtbase/src/corelib/thread/qthread_unix.cpp.

考虑到以上所有情况,问题就变成了,为什么 OS-命令(Qt 正在调用)返回 2 而不是更合适的数字?这对我来说听起来像是一个错误,尽管另一种可能性是 idealThreadCount() 返回了正确的数字,但是您的 QSpinBox 出于某种原因将该数字限制为 2。如果您还没有这样做,我建议直接打印出 cpuInfo.idealThreadCount() 返回的值,除了将其传递给 setValue(),以确保万无一失。

试试下面的代码:

auto const value = 8;
auto *nmb_nodes = ui->spnBx_nmb_nodes;
nmb_nodes->setValue(value);
Q_ASSERT(nmb_nodes->value() == value);

我敢打赌断言不会实现。所以你的问题很可能不是你想的那样。