並行編程中動態獲取可用 CPU 核心數是決定線程池大小、任務分割粒度的關鍵。本文提供 Linux/Windows 雙平台統一封裝函數,並對比各系統 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
}
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 密集型
一行調用,跨平台獲取核心數,讓並行程序自適應部署環境!