获取计算机CPU核心数

·

#include <Windows.h>

DWORD CountSetBits(ULONG_PTR bitMask)
{
	DWORD LSHIFT = sizeof(ULONG_PTR) * 8 - 1;
	DWORD bitSetCount = 0;
	ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT;
	DWORD i;

	for (i = 0; i <= LSHIFT; ++i)
	{
		bitSetCount += ((bitMask & bitTest) ? 1 : 0);
		bitTest /= 2;
	}

	return bitSetCount;
}

VOID GetProcessorCoreCount(PDWORD LogicalProcessorCount, PDWORD ProcessorCoreCount)
{
	PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ProcessorInfo;
	DWORD ReturnedLength = 0;

	*LogicalProcessorCount = 0;
	*ProcessorCoreCount = 0;
	GetLogicalProcessorInformation(NULL, &ReturnedLength);
	ProcessorInfo = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)LocalAlloc(LPTR, ReturnedLength);
	GetLogicalProcessorInformation(ProcessorInfo, &ReturnedLength);

	for (DWORD i = 0; i < ReturnedLength / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); i++)
	{
		if (ProcessorInfo[i].Relationship == RelationProcessorCore)
		{
			(*ProcessorCoreCount)++;
			*LogicalProcessorCount += CountSetBits(ProcessorInfo[i].ProcessorMask);
		}
	}
	LocalFree(ProcessorInfo);
}


int main()
{
	DWORD LogicalProcessorCount, ProcessorCoreCount;
	GetProcessorCoreCount(&LogicalProcessorCount, &ProcessorCoreCount);
	printf("logical:%d  core:%d\n", LogicalProcessorCount, ProcessorCoreCount);
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注