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_INFO
的 dwNumberOfProcessors
值调用填充的结构。
在 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);
我敢打赌断言不会实现。所以你的问题很可能不是你想的那样。
我需要在 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_INFO
的 dwNumberOfProcessors
值调用填充的结构。
在 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);
我敢打赌断言不会实现。所以你的问题很可能不是你想的那样。