我在std::vector
的并行循环之前填充了std::pair<Object, bool>
。 bool都初始化为true
。循环大致如下:
for (int x = 0; x < xMax; ++x) // can parallelising the loop in x cause a data race?
for (int y = 0; y < yMax; ++y)
for (auto& i : vector)
if (i.first.ConstantFunctionDependingOnlyOnInput(x, y))
i.second = false;
由于我们只是将bool设置为false
我没有看到这导致数据竞争,但我不相信我对多线程的直觉。对此bool的结果进行的操作在之后的单个线程中完成(使用标准算法擦除向量中bool == true
的所有元素。
这里的建议将不胜感激。我打算使用std::atomics
,但当然,它们无法在std::vector
中使用,因为它们不是可复制构造的。
干杯!
答案 0 :(得分:3)
以下是一个可能失败的方法的示例,现实世界的代码已经以这种方式失败。
for (auto& i : vector)
if (i.first.ConstantFunctionDependingOnlyOnInput(x, y))
i.second = false;
编译器可能会按如下方式优化此代码:
for (auto& i : vector);
{
bool j = i.second;
bool k = i.first.Function(x, y);
i.second = k ? false : j;
}
这可能导致一个线程覆盖另一个线程的结果。这可能是合法的优化,因为无条件写入可能比条件写入更便宜,因为它不会被错误预测。
答案 1 :(得分:-2)