首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

跨平台獲取 CPU 核心數:Windows/Linux 統一 C 實現

     編輯:關於C語言

需求場景

並行計算、線程池大小設置、負載均衡策略中,常需在運行時動態獲取可用邏輯核心數,以決定最佳並行度。

平台差異 API 對比

平台API頭文件關鍵字段/返回值
WindowsGetSystemInfo()<windows.h>SYSTEM_INFO.dwNumberOfProcessors
Linux (glibc)sysconf()<unistd.h>_SC_NPROCESSORS_ONLN (在線核心數)
Linux (GNU 擴展)get_nprocs()<sys/sysinfo.h>直接返回在線核心數
其他 Unixsysconf()<unistd.h>同 Linux

注意:_SC_NPROCESSORS_CONF 返回配置核心數(含禁用),不可用於並行度決策。

統一跨平台封裝

#if defined(_WIN32) || defined(_WIN64)
    #include 
    typedef int Int_t;  // 或使用 stdint.h
#elif defined(__linux__) || defined(__sun) || defined(_AIX)
    #include 
    #include 
    typedef int Int_t;
#else
    #error "Unsupported OS"
#endif

Int_t get_CPU_core_num(void) {
#if defined(_WIN32) || defined(_WIN64)
    SYSTEM_INFO info;
    GetSystemInfo(&info);
    return info.dwNumberOfProcessors;
#elif defined(__linux__) || defined(__sun) || defined(_AIX)
    return get_nprocs();  // GNU 推薦,等同 sysconf(_SC_NPROCESSORS_ONLN)
#else
    return 1;  // 兜底
#endif
}

使用示例

int cores = get_CPU_core_num();
printf("可用核心數: %d\n", cores);
// 線程池大小 = cores 或 cores * 2 (IO 密集型)

編譯提示

  • Windows (MSVC):無需額外鏈接庫。
  • Linux (GCC):gcc -std=c11 -D_GNU_SOURCE 確保 get_nprocs 可見。
  • 交叉編譯時通過 -D_WIN32 / -D__linux__ 指定目標平台宏。

進階:獲取物理核心數 / NUMA 拓撲

邏輯核心數包含超線程。若需物理核心數或拓撲感知調度:

  • Linux:解析 /proc/cpuinfo 或使用 hwloc 庫。
  • Windows:GetLogicalProcessorInformationEx (Win7+)。
  • 跨平台推薦 hwloc 庫,統一 API 獲取完整拓撲。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved