c++ - 有条件地并行填充 vector

标签 c++ multithreading algorithm vector

我想编写以下代码的多线程版本

template<typename Out, typename In, typename Cond, typename Func>
std::vector<Out> collect(std::vector<In> const&values,
                         Cond const&cond, Func const&func)
{
    std::vector<Out> result;
    for(auto const&val : values)
        if(cond(val))
            result.emplace_back(func(val));
    return result;
}

所选元素的顺序无关紧要。

一个简单的方法是

template<typename Out, typename In, typename Cond, typename Func>
std::vector<Out> collect(std::vector<In> const&values,
                         Cond const&cond, Func const&func)
{
    std::vector<Out> result(values.size());
    std::atomic<size_t> index = 0;
    // some multithreaded for loop implementation
    parallel_for(size_t(0),values.size(),[&](size_t i) {
        if(cond(values[i]))
            result[index++] = func(values[i]);
    });
    result.resize(index);
    return result;
}

(当然,初始化result是串行的,这里先忽略)。这似乎有效,但可能不是无锁的。有没有更好的办法?特别是,我能否避免分配太多数据(如果只选择了少量输入数据)?

问题与 std::copy_if 非常相似(它会是 std::transform_if 存在)——并行版本如何 std::copy_if(std::par,...)已实现(这是 C++17,但我仅限于 C++11)?

最佳答案

一个不错的方法是使用在最后合并的线程本地 vector 。如果不是因为它使用 OMP,这个答案(特别是最后一个代码示例)将是一个很好的拷贝:

https://stackoverflow.com/a/18671256/9528746

编辑:更改为更好的答案。

关于c++ - 有条件地并行填充 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53431208/

相关文章:

c++ - Qt 5.2模型- View -模式: How to inform model object about changes in underlying data structure

algorithm - 确定 map 中的比例因子

c++ - 在自定义对象上查找

c++ - 如何在不将内部类定义放入父类的情况下创建内部类?

c - 在c中选择一个随机线程

java - 如何对 Java EE 数据库审计记录器进行多线程处理?

java - 如何创建线程安全的 JSP 页面

algorithm - 从运行时分析中推导出时间复杂度

arrays - O(log n)算法在排序数组中找到最佳插入位置

c++ - 如何通过 decltype 声明迭代器的值