TBB Parallel_用于计数,增量变量不准确
TBB Parallel_for count, increment variable inaccurate
我知道,通过并行过程,如果不适当的护理,您就可以获得一个线程修改另一个线程访问的变量,导致各种错误等。
我正在尝试编写使用" 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>
。
相关文章:
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- 在头文件中定义变量不会出错
- GDB 断点在 Mac 上是不准确的
- 为什么我的数组值与此处的全局变量不匹配?
- 静态成员变量不会由 gettext 转换
- 是否允许类类型的 std::function 成员变量(不完整类型)?
- 变量不在 lambda 的范围内
- cout 打印不准确的结果,printf 打印准确的结果
- constexpr 函数在编译时获取值,即使我的变量不是 constexpr
- 为什么当我使用 std::string::operator[] 时自动变量不会成为引用?
- Constexpr变量不是编译时值
- 表达式必须具有常数值,变量不能用作定义数组大小的常数
- 为什么我的 std::atomic<int> 变量不是线程安全的?
- 变量不能明确
- C++中的 Json:将数字解析为字符串以避免浮点不准确
- 为什么非成员静态 constexpr 变量不是隐式内联的?
- TBB Parallel_用于计数,增量变量不准确
- C++中的双类型变量乘法会导致值不准确