首页 > 解决方案 > 是否可以限制 C++ 17 并行“for_each”的线程数?

问题描述

我使用std::for_eachwithstd::execution::par对表示为结构向量的巨大输入执行复杂计算。计算不需要任何与硬件相关的延迟(例如网络或磁盘 IO),它是“仅 CPU”计算。对我来说,创建更多我们拥有硬件线程的操作系统线程是没有意义的,这看起来是合乎逻辑的。但是,Visual C++ 2019 平均创建 50 个线程,有时甚至可以创建 500 个线程,即使只有 12 个硬件线程。

有没有办法将并行线程数限制为hardware_concurrencywith std::for_eachstd::execution::par或者创建合理线程数的唯一方法是使用自定义代码 with std::thread

标签: c++multithreading

解决方案


是否可以限制 C++ 17 并行的线程数for_each

不,至少在 C++17 中没有。但是,executors在一个标准中提出了一个建议,它基本上使您能够影响高级 STL 算法接口的执行上下文(在位置和时间方面):

thread_pool pool{ std::thread::hardware_concurrency() };
auto exec = pool.executor();
std::for_each(std::execution::par.on(exec), begin(data), end(data), some_operation);

到那时,您必须相信您的编译器供应商,他知道什么对整体性能最有利,例如 Visual Studio 的开发人员状态

我们实现中的调度由 Windows 系统线程池处理。线程池利用标准库不可用的信息,例如系统上的其他线程正在做什么,线程正在等待什么内核资源,等等。它选择何时创建更多线程以及何时终止它们。它还与其他系统组件共享,包括那些不使用 C++ 的组件。

另一种选择是放弃仅依赖标准库并使用已包含新提案的 STL 实现。


推荐阅读