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

C語言跨平台獲取 CPU 核心數:Linux/Windows 統一封裝

     編輯:關於C

並行編程中動態獲取可用 CPU 核心數是決定線程池大小、任務分割粒度的關鍵。本文提供 Linux/Windows 雙平台統一封裝函數,並對比各系統 API 差異與陷阱。

平台 API 對比

平台API頭文件含義備註
Windows`GetSystemInfo(&si)````si.dwNumberOfProcessors`邏輯處理器數 (含超線程)
Linux (POSIX)`sysconf(_SC_NPROCESSORS_ONLN)```**在線可用** 核心數推薦,排除離線核
Linux (POSIX)`sysconf(_SC_NPROCESSORS_CONF)```配置核心數 (含禁用)不推薦用於線程池
GNU 擴展`get_nprocs()```同 `_SC_NPROCESSORS_ONLN`Linux 專用,簡潔
GNU 擴展`get_nprocs_conf()```同 `_SC_NPROCESSORS_CONF`同上

跨平台封裝函數

#include 

typedef int32_t Int_t;  // 統一類型

Int_t get_CPU_core_num(void) {
#if defined(_WIN32) || defined(_WIN64)
    SYSTEM_INFO info;
    GetSystemInfo(&info);
    return (Int_t)info.dwNumberOfProcessors;
#elif defined(__linux__) || defined(__sun) || defined(_AIX)
    return (Int_t)get_nprocs();  // GNU 擴展,簡潔可靠
#else
    #error "Unsupported OS"
#endif
}

關鍵細節解析

  • 宏檢測:`_WIN32`/`_WIN64` 覆蓋 32/64 位 Windows;`__linux__`、`__sun` (Solaris)、`_AIX` 覆蓋主流 Unix-like。
  • 返回類型:用固定寬度 `int32_t` 避免 `int`/`long` 跨平台差異。
  • 錯誤處理:`sysconf` 返回 `-1` 表示錯誤,生產代碼建議檢查 `errno` 並提供兜底值 (如 1)。
  • 容器環境:Docker/K8s 中 `sysconf` 返回宿主機核心數,受 `cpuset` 限制實際可用核心可能更少。進階場景需解析 `/sys/fs/cgroup/cpuset/cpuset.cpus`。
  • 超線程:所有 API 返回**邏輯核心數** (物理核 × 超線程)。CPU 密集型任務建議用物理核心數 (`lscpu -p` 解析或 `GetLogicalProcessorInformationEx`)。

使用示例

int cores = get_CPU_core_num();
printf("Available CPU cores: %d\n", cores);

// 線程池大小建議
int thread_pool_size = cores;  // CPU 密集型
// int thread_pool_size = cores * 2;  // I/O 密集型

編譯提示

  • Windows:`cl main.c` (MSVC) 或 `gcc main.c -o main.exe` (MinGW)。
  • Linux:`gcc main.c -o main`。
  • 交叉編譯時確保目標平台宏正確定義。

一行調用,跨平台獲取核心數,讓並行程序自適應部署環境!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved