gpt4 book ai didi

c++ - 这个并行循环会导致数据竞争吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:00 27 4
gpt4 key购买 nike

我有一个 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 的结果进行的操作随后在单个线程中完成(使用标准算法删除 vector 中 bool == true 处的所有元素。

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

干杯!

最佳答案

这是一个失败的例子,现实世界的代码正是以这种方式失败的。

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

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

关于c++ - 这个并行循环会导致数据竞争吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32213025/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com