如何并行迭代 directory_iterator?

How to iterate through a directory_iterator in parallel?

std::filesystem::directory_iterator 是一个 LegacyInputIterator 显然它不能并行使用 std::for_each

我可以遍历 directory_iterator,获取项目,将它们放入向量中并使用该向量进行并行迭代。

上面的步骤可以省略吗?有没有办法像这样并行迭代 directory_iterator

std::for_each(
    std::execution::par_unseq, // This is ignored currently
    std::filesystem::begin(dir_it),
    std::filesystem::end(dir_it),
    func
);

directory_iterator 是一个输入迭代器,这意味着它在遍历过程中生成值。此外,对同一目录的多次遍历可能会产生不同的值序列(无论是顺序还是值本身),这意味着遍历不可重新启动。

对于并行算法,这意味着序列不能被分割,迭代必须在一个线程中按顺序发生。并行处理的唯一机会是将 func 执行卸载到单独的线程,这可能有效也可能无效。文件系统迭代是昂贵的,甚至可能比 func 中的处理更昂贵。在这种情况下,您可能会观察到 func 被顺序调用,当每个调用设法在迭代器增量完成之前完成时。

标准库实现是permitted忽略执行策略参数并串行执行算法。例如,如果输入序列无法分区,实现可能根本不会理会函数调用的并行化。