C++中的最大线程数

Maximum number of threads in C++

知识问答

通常,当我想用​​C++编写多线程程序时,我会询问硬件支持的并发线程数,如下所示:

unsigned int numThreads = std::thread::hardware_concurrency();

这个returns支持的并发总数。因此,如果我们有 2 个 CPU,每个都可以支持 12 个线程,那么 numThreads 将等于 24。

问题

最近我使用 numactl 强制执行一个程序 运行 仅在一个 CPU 上。

numactl -N 1 ./a.out

问题是 std::thread::hardware_concurrency() returns 24 即使我 运行 它与 numactl -N 1 一样。然而,在这样的设置下 nproc 的输出是 12.

numactl -N 1 nproc --> output = 12

问题

也许std::thread::hardware_concurrency()并不是为了支持这种情况而设计的。那不是我关心的。我的问题是,当我想 运行 我的程序 numactl.

时,获得支持的线程数的 最佳实践是什么

更多信息

如果您还没有处理过 numactl,它可以用于 运行 使用 NUMA 策略的进程。例如,您可以使用它来强制您的程序仅在一个 CPU 上 运行。这种情况的用法如上所示。

您必须使用 OS 特定调用来查询它对您的流程施加的限制。

hardware_concurrency 可能 return 提示(由您的硬件)支持的线程数,或者 return 0。 OS 可以将您的进程限制为比这个数字更少的线程(或者可能使用更多),无论是使用像 numactl 这样的工具,正常调度,还是其他一些方式。某些进程或用户总是有可能更改允许的 CPU 集,这会影响可用的并发性。典型的 C++ 程序不必关心这些细节,特别是因为可用线程数的变化通常是短暂的。