C 如何在Win32中获取内核数?

C 如何在Win32中获取内核数?,c,windows,multithreading,winapi,cpu-cores,C,Windows,Multithreading,Winapi,Cpu Cores,我正在windows上用C编写一个程序,它需要运行尽可能多的线程。但是我不知道如何获得内核的数量。有什么想法吗?您可以调用WinAPI函数;它返回一个SYSTEM\u INFOstruct,其中包含处理器数量(即具有多个核心CPU的系统上的内核数量)。您可以读取处理器数量环境变量。即使该问题涉及.NET,您的问题涉及C,但基本回答应该有帮助: 在windows启动时键入“cmd”,然后打开“cmd.exe”。 现在键入以下命令: WMIC CPU Get /Format:List 您会发现类似

我正在windows上用C编写一个程序,它需要运行尽可能多的线程。但是我不知道如何获得内核的数量。有什么想法吗?

您可以调用WinAPI函数;它返回一个
SYSTEM\u INFO
struct,其中包含处理器数量(即具有多个核心CPU的系统上的内核数量)。

您可以读取处理器数量环境变量。

即使该问题涉及.NET,您的问题涉及C,但基本回答应该有帮助:

在windows启动时键入“cmd”,然后打开“cmd.exe”。 现在键入以下命令:

WMIC CPU Get /Format:List
您会发现类似“NumberOfCores”和“NumberOfLogicalProcessors”的条目。通常,逻辑处理器是通过线程实现的。因此,这种关系通常是这样的

NumberOfLogicalProcessors=NumberOfCores*每个核心的线程数

由于每个核心都服务于一个处理单元,因此通过线程,逻辑处理单元在实际空间中实现


更多信息。

正如@Changming Sun在上面的评论中提到的,GetSysInfo返回逻辑处理器的数量,它并不总是与处理器核心的数量相同。在支持超线程的计算机上(包括大多数现代Intel CPU),可以在同一个内核上运行多个线程(从技术上讲,多个线程将在同一个内核上加载其线程上下文)。要获得处理器内核的数量,需要调用GetLogicalProcessorInformation和一点编码工作。基本上,您会得到一个系统、逻辑、处理器信息条目的列表,并且您必须使用RelationProcessorCore集合计算条目的数量。如何在Microsoft提供的GetLogicalProcessorInformation文档中对此进行编码的一个很好的示例:

通常情况下,“如何在WINDOWS中获取内核数/使用WINDOWS API”是一个比“如何在C中获取内核数”更好的标题。它取决于可用的API(和平台),而不是编程语言。确切副本:有关可移植信息,请参阅:。@adcdefg,这是针对unix而不是win32的。通常最好调用API函数,而不是依赖辅助环境变量(在运行程序之前,可能会被其他变量更改).根据问题的目的,这可能是更好的答案。如果您想了解内核数量如何决定要启动多少线程,那么应该考虑此环境变量,因为四核上的父进程可以启动进程,并将两个进程的值都传递给2,而不是4。我认为,在90%的情况下,这正是我们想要的(除非开发人员意识到,可能在5到10年内,只能使用由操作系统控制的全系统操作系统利用率感知线程池。程序员是迟钝的)。那么具有多个多核CPU的系统呢?我很确定Windows会在某个地方深入到这个细节,尽管我不知道这是否重要。dwNumberOfProcessors是逻辑处理器计数,而不是内核数。这在32位系统上限制为32,在64位系统上限制为64,因为它只返回当前处理器组中的处理器数。在内核数超过此值的系统上,它将不会返回正确的值。对于在WOW64下运行的32位进程,它也不会返回正确的值。