我将std::for_each
与std::execution::par
结合使用以对表示为结构矢量的巨大输入执行复杂的计算。该计算不需要任何与硬件有关的延迟(例如,网络或磁盘IO),它是“仅CPU”计算。对我来说,似乎没有道理可以创建更多拥有硬件的OS线程;但是,Visual C ++ 2019平均创建50个线程,有时甚至只有12个硬件线程,最多可以创建500个线程。
是否有一种方法可以将并行线程数限制为hardware_concurrency
和std::for_each
的std::execution::par
,或者创建合理线程数的唯一方法是使用带有std::thread
的自定义代码?
是否可以限制C ++ 17并行
for_each
的线程数?
不,至少在C ++ 17中不这样。但是,对于标准中的executors
,有一个建议,它基本上使您能够影响高级STL算法接口的执行上下文(在位置和时间方面):
executors
[在此之前,您要么必须信任编译器供应商,否则他会知道最适合整体性能的信息,例如Visual Studio 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);
的开发人员:
我们实施中的计划由Windows系统处理线程池。线程池利用信息而不是适用于标准库,例如系统正在做什么,线程正在等待什么内核资源,以及类似。它选择何时创建更多线程以及何时终止他们。它还与其他系统组件共享,包括那些不使用C ++。
另一种选择是放弃仅依赖标准库,而使用已经包含新建议的STL实现。