TBB Parallel_用于计数,增量变量不准确

TBB Parallel_for count, increment variable inaccurate

本文关键字:变量 不准确 Parallel 用于 TBB      更新时间:2023-10-16

我知道,通过并行过程,如果不适当的护理,您就可以获得一个线程修改另一个线程访问的变量,导致各种错误等。

我正在尝试编写使用" parallel_for"的代码,一个全局变量'count'和一个增加"计数"的条件。

满足条件后,我将从平行的内部调用count 。

对于数据验证,我设置了一个Parallel_Reduce,它也检查了相同的条件,并且我收到了不同的结果,这比Parallel_FOR所获得的结果更高,这就是为什么我知道Parallel_for正在引起问题的原因。

我是正确的,我认为使用" count "仍在导致种族条件,因为我最初的假设是count 会因为我从不存储一个值,而只是在时间点上,只是说添加1个无论"计数"是什么。我想尽可能避免使用静音或锁。

int count = 0;
parallel_for(blocked_range2d<int, int>(0, smallestHeight, 0, smallestWidth), [&](const blocked_range2d<int, int>&r) {
        auto y1 = r.rows().begin();
        auto y2 = r.rows().end();
        auto x1 = r.cols().begin();
        auto x2 = r.cols().end();
        for (auto y = y1; y < y2; y++) {
            for (auto x = x1; x < x2; x++) {
                int pixelValue = rgbDiffVal[y][x].rgbRed + rgbDiffVal[y][x].rgbGreen + rgbDiffVal[y][x].rgbBlue;
                if (pixelValue > bThreshold) {
                    count++;
                }
            }
        }
    });

tbb::parallel_for假定环的主体是线程安全的,即没有种族。在这种情况下,它确实具有种族,因为它在不同步的情况下修改了全局变量。修改仅是"当前值是什么"的事实,这仍然是一场比赛(例如,某些硬件可能会实现 作为从内存中读取值的值价值回到记忆(。

为了修复此代码,请将count声明为原子变量:std::atomic<int>如果使用C 11,或用于该语言的早期版本的tbb::atomic<int>