2

std::vector在并行循环之前填充了std::pair<Object, 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;

由于我们只是将布尔值设置为false我不认为这会导致数据竞争,但我不相信我对多线程的直觉。之后对该布尔结果进行的操作在单个线程中完成(bool == true使用标准算法擦除向量中的所有元素。

这里的建议将不胜感激。我打算使用std::atomics,但当然,它们不能用于 a ,std::vector因为它们不是可复制构造的。

干杯!

4

2 回答 2

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;
}

这可能导致一个线程覆盖另一个线程的结果。这可能是一种合理的优化,因为无条件写入可能比有条件写入便宜,因为它不会被错误预测。

于 2015-08-25T20:07:00.363 回答
-2

你是对的 - 这将在任何现实世界的系统上完全符合你的预期(没有数据竞争)。虽然根据 C++ 标准官方未定义行为,但现实世界的系统并非如此。是对包括此问题在内的更广泛问题的答案。

但是,标准中的文本说这是官方未定义的:

如果其中一个修改了内存位置 (1.7) 而另一个访问或修改了相同的内存位置,则两个表达式求值会发生冲突。

如果您想要标准保证的安全性,您可以考虑原子内存访问。

于 2015-08-25T20:06:27.597 回答