分类
C++ OS

C/C++ 获取CPU核心数

有时候我们的多线程程序要确定并发数(线程数), 这时候我们可能比较关心当前环境CPU核心数

Windows

Windows为我们提供了一些API, 比如GetSystemInfo(), 可以获得当前系统的一些信息, 这个函数包含在<windows.h>中, 然后获取其中的dwNumberOfProcessors成员即可

#if defined(_WIN32)
SYSTEM_INFO info;
GetSystemInfo (&info);
return info.dwNumberOfProcessors;

Linux

Linux则更加方便, 直接调用GNU函数get_nprocs()即可

Code

所以代码如下:

int get_cpu_cores()
{
#if defined(_WIN32)
    SYSTEM_INFO info;
    GetSystemInfo (&info);
    return info.dwNumberOfProcessors;
#elif defined(LINUX) || defined(SOLARIS) || defined(AIX)
    return get_nprocs();   //GNU fuction
#else
#error  UNKNOWN OS!
#endif
}
分类
OS

并发与并行

如果某个系统支持两个或者多个动作(Action)同时存在,那么这个系统就是一个并发系统。如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。并发系统与并行系统这两个定义之间的关键差异在于“存在”这个词。

在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每个线程都处于执行过程中的某个状态。如果程序能够并行执行,那么就一定是运行在多核处理器上。此时,程序中的每个线程都将分配到一个独立的处理器核上,因此可以同时运行。

我相信你已经能够得出结论——“并行”概念是“并发”概念的一个子集。也就是说,你可以编写一个拥有多个线程或者进程的并发程序,但如果没有多核处理器来执行这个程序,那么就不能以并行方式来运行代码。因此,凡是在求解单个问题时涉及多个执行流程的编程模式或者执行行为,都属于并发编程的范畴。

摘自:《并发的艺术》 — 〔美〕布雷谢斯