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

问题描述 投票:4回答:1

我将std::for_eachstd::execution::par结合使用以对表示为结构矢量的巨大输入执行复杂的计算。该计算不需要任何与硬件有关的延迟(例如,网络或磁盘IO),它是“仅CPU”计算。对我来说,似乎没有道理可以创建更多拥有硬件的OS线程;但是,Visual C ++ 2019平均创建50个线程,有时甚至只有12个硬件线程,最多可以创建500个线程。

是否有一种方法可以将并行线程数限制为hardware_concurrencystd::for_eachstd::execution::par,或者创建合理线程数的唯一方法是使用带有std::thread的自定义代码?

c++ multithreading
1个回答
0
投票

是否可以限制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实现。

© www.soinside.com 2019 - 2024. All rights reserved.