有没有办法明确设置/限制std::async
和相关类使用的并行度(=单独线程数)?
Perusing the thread support library没有发现任何有希望的东西。
尽可能接近,std::async
实现(通常是?)在内部使用线程池。是否有标准化的API来控制它?
对于后台:我在一个设置(共享集群)中,我必须手动限制使用的核心数。如果我没有这样做,负载共享调度程序会抛出一个拟合,我会受到惩罚。特别是,std::thread::hardware_concurrency()
没有任何有用的信息,因为物理核心的数量与我所受的约束无关。
这是一段相关的代码(在C ++ 17中使用并行TS,可能会使用parallel std::transform
编写):
auto read_data(std::string const&) -> std::string;
auto multi_read_data(std::vector<std::string> const& filenames, int ncores = 2) -> std::vector<std::string> {
auto futures = std::vector<std::future<std::string>>{};
// Haha, I wish.
std::thread_pool::set_max_parallelism(ncores);
for (auto const& filename : filenames) {
futures.push_back(std::async(std::launch::async, read_data, filename));
}
auto ret = std::vector<std::string>(filenames.size());
std::transform(futures.begin(), futures.end(), ret.begin(),
[](std::future<std::string>& f) {return f.get();});
return ret;
}
从设计的角度来看,我已经期望std::execution::parallel_policy
类(来自并行性TS)允许指定(事实上,这就是我在为我的硕士论文设计的框架中这样做的方式) 。但事实似乎并非如此。
理想情况下,我想要一个C ++ 11的解决方案,但是如果有一个用于更高版本的解决方案,我仍然想知道它(虽然我不能使用它)。
答案 0 :(得分:4)
没有。 std::async
是不透明的,您无法控制它对线程,线程池或其他任何东西的使用。事实上,你根本不保证它会使用一个线程 - 它也可以在同一个线程中执行(可能,请注意下面的@TC注释),这样的实现仍然符合要求。 / p>
C ++线程库从来不应该处理线程管理的OS /硬件细节的微调,所以我担心,在你的情况下你将不得不自己编写代码以获得适当的支持,可能使用OS提供的线程控制原语
答案 1 :(得分:2)
正如其他人所说,a=$(sed -ne 's/[^a-z]//g' -e 's/^.*secure=//p' -e 1q "$CLUSTERS_CONF")
不允许你这样做。
<强>然而强>
您正在描述Executors的一个更简单的用例,它目前仍在C ++标准化的设计空间中蹦蹦跳跳,特别是现在Study Group 1: Concurrency。
由于阅读WG21标准提案可能是一个障碍,他们的作者有助于prototype header-only reference implementation和some example code。
它甚至包括一个静态线程池,以及几乎完全符合您要求的示例: async_1.cpp
std::async
感谢@ jared-hoberock指点我P0668R0作为P0443R1的更简单的后续内容,我在此答案的早期版本中引用了该内容。
这种简化已经应用,现在有一篇论文描述了基本原理(P0761R0),以及P0443R2中标准措辞的更简单版本。
截至2017年7月,我在交付时看到的唯一实际猜测是:Concurrency TS的编辑Michael Wong,执行者的标准化工具---感觉“{{3} }。