c++ - reduce_parallel 不是线程安全函数吗?

标签 c++ tbb

我想调用 parallel_reduce 来对 vector 元素求和。但是我发现如果 vector 元素足够了,结果是不正确的。请帮助我如何使用此功能。

// prepare data
    const size_t allNum = 1000000;
    std::vector<double> a;
    for (int i = 0; i < allNum; ++i)
    {
        a.push_back(double(i + 1));
    }

    // λ func
    auto f = [&]() -> double {
        return tbb::parallel_reduce(tbb::blocked_range<size_t>(0, allNum), 
            0.0,
            [&](const tbb::blocked_range<size_t>& r, double init) -> double {
            for (int i = r.begin(); i < r.end(); ++i)
            {
                init += a[i];
            }
            return init;
        },
            [](double f, double s) -> double {
            return f + s;
        }
            /*std::plus<double>()*/);
    };

    // call λ func, get the result
    double correctResult = (1.0 + 1000000.0) * 500000.0;
    double sum = f(); // sum != correctResult
    // sum is different every loop

最佳答案

关于c++ - reduce_parallel 不是线程安全函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68736845/

相关文章:

c++ - 从硬盘读取数据并将其放入 C++ 容器中

在数组中查找 'maximal difference' 的 C++ 算法

c++ - 英特尔线程构建模块性能不佳

C++ 优化数组从 int 到 float 的转换

c++ - Visual C++ express 2010 程序入口点 ??1task_group_context@tbb@@QAE@XZ 无法位于动态链接库 tbb.dll 中

c++ - 英特尔线程 C API

c++ - OpenGL glReadPixels 返回 0

c++ - 检查 unordered_set 是否包含其他 unordered_set 中的所有元素 - C++

c++ - Boost 进程间分配器 - 管理文件大小

windows - opencv dll 错误 - 无法在 KERNEL32.dll 中找到过程 LoadPackagedLibrary