並行計算、線程池大小設置、負載均衡策略中,常需在運行時動態獲取可用邏輯核心數,以決定最佳並行度。
| 平台 | API | 頭文件 | 關鍵字段/返回值 |
|---|---|---|---|
| Windows | GetSystemInfo() | <windows.h> | SYSTEM_INFO.dwNumberOfProcessors |
| Linux (glibc) | sysconf() | <unistd.h> | _SC_NPROCESSORS_ONLN (在線核心數) |
| Linux (GNU 擴展) | get_nprocs() | <sys/sysinfo.h> | 直接返回在線核心數 |
| 其他 Unix | sysconf() | <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 密集型)
gcc -std=c11 -D_GNU_SOURCE 確保 get_nprocs 可見。-D_WIN32 / -D__linux__ 指定目標平台宏。邏輯核心數包含超線程。若需物理核心數或拓撲感知調度:
/proc/cpuinfo 或使用 hwloc 庫。GetLogicalProcessorInformationEx (Win7+)。hwloc 庫,統一 API 獲取完整拓撲。